diff --git a/web/content/blog/posts/0-8-2-released.md b/web/content/blog/posts/0-8-2-released.md new file mode 100644 index 0000000000..537854ad9b --- /dev/null +++ b/web/content/blog/posts/0-8-2-released.md @@ -0,0 +1,18 @@ +--- +title: Wheels 0.8.2 Released +slug: 0-8-2-released +publishedAt: '2008-12-29T21:29:56.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + The Wheels community has been finding some bugs here and there, which has + resulted in an improved product for everyone. That said, ColdFusion on Wheels + 0.8.2(http://www.cfwheels.com/download) is av... +coverImage: null +legacyId: '12' +--- + +The Wheels community has been finding some bugs here and there, which has resulted in an improved product for everyone. That said, [ColdFusion on Wheels 0.8.2](http://www.cfwheels.com/download) is available today. This includes many critical bug fixes. We recommend upgrading to this version as soon as you can. Keep the feedback coming, everyone! diff --git a/web/content/blog/posts/0-8-3-final-beta-release.md b/web/content/blog/posts/0-8-3-final-beta-release.md new file mode 100644 index 0000000000..c9086a2fca --- /dev/null +++ b/web/content/blog/posts/0-8-3-final-beta-release.md @@ -0,0 +1,18 @@ +--- +title: 'Wheels 0.8.3: Our Final Beta Release?' +slug: 0-8-3-final-beta-release +publishedAt: '2008-12-28T21:20:32.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + You probably didn't see this one coming, at least not so soon... Wheels 0.8.3. + I'm most excited to announce that this release introduces support for Railo + Express 3.0(http://www.railo-technologies.... +coverImage: null +legacyId: '10' +--- + +You probably didn't see this one coming, at least not so soon... Wheels 0.8.3. I'm most excited to announce that this release introduces support for [Railo Express 3.0](http://www.railo-technologies.com/en/index.cfm?treeID=200). As soon as the open sourced Railo 3.1 is released, we'll have an opportunity to offer a full-stack open source CFML environment similar to [Ruby on Rails](http://www.rubyonrails.org/). Many thanks to Wheels's Peter Amiri and the Railo team for their efforts in getting this working. Additionally, there were some bugs that Per couldn't live with in the last release, so he cranked this one out for everyone. We're getting pretty stable at this point. Keep the [bug reports](http://code.google.com/p/cfwheels/issues/list) coming as we near the release candidate for 1.0! Please note that there were some changes to method names that will probably affect your Wheels application after upgrading. Refer to our guide on [Upgrading to Wheels 0.8](http://www.cfwheels.com/docs/chapter/upgrading-to-wheels-0.8) for _highlights_ on what has changed with this 0.8.3 release. diff --git a/web/content/blog/posts/0-9-1-available.md b/web/content/blog/posts/0-9-1-available.md new file mode 100644 index 0000000000..7ac3cbb4e6 --- /dev/null +++ b/web/content/blog/posts/0-9-1-available.md @@ -0,0 +1,29 @@ +--- +title: Wheels 0.9.1 Available +slug: 0-9-1-available +publishedAt: '2009-12-27T21:02:21.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We are excited to announce the availability of ColdFusion on Wheels + 0.9.1(http://www.cfwheels.org/download). I personally can tell you that the + core team and community have really outdone themselve... +coverImage: null +legacyId: '37' +--- + +We are excited to announce the availability of [ColdFusion on Wheels 0.9.1](http://www.cfwheels.org/download). I personally can tell you that the core team and community have really outdone themselves with this release. It is a giant step toward an impending release candidate. Here is a brief listing of what Wheels developers gain from this release: + +- Ability to set global defaults for most functions' optional arguments +- Upgrade-friendly configuration settings +- Support for using multiple data sources (set on a per-model basis) +- Ability to group view helpers by controller +- Support for sending multi-part emails (HTML and plain text in same email) +- New PluginManager plugin that helps you find and install plugins +- Improved Railo support +- Lots of bug fixes and other minor improvements + +Review the [Upgrading to Wheels 0.9.1](http://www.cfwheels.org/docs/chapter/upgrading-to-wheels-0.9.1) chapter to see what you would need to change in your application when upgrading. Because of the big changes to the way that configurations are done, we figured this would be a good time to finish the chapter on [Configuration and Defaults](http://www.cfwheels.org/docs/chapter/configuration-and-defaults). More reference chapters and documentation on the functions in the Wheels API are in the works, so stay tuned. diff --git a/web/content/blog/posts/0-9-2-release.md b/web/content/blog/posts/0-9-2-release.md new file mode 100644 index 0000000000..108f773125 --- /dev/null +++ b/web/content/blog/posts/0-9-2-release.md @@ -0,0 +1,18 @@ +--- +title: Wheels 0.9.2 Release +slug: 0-9-2-release +publishedAt: '2009-12-18T20:59:52.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We've released ColdFusion on Wheels 0.9.2 into the wild this evening. No new + features really, but quite a few bug fixes. Download version + 0.9.2(http://www.cfwheels.org/download) and bring your Whee... +coverImage: null +legacyId: '35' +--- + +We've released ColdFusion on Wheels 0.9.2 into the wild this evening. No new features really, but quite a few bug fixes. [Download version 0.9.2](http://www.cfwheels.org/download) and bring your Wheels app that much closer to 1.0. (We're getting really close.) diff --git a/web/content/blog/posts/0-9-final-beta-cycle.md b/web/content/blog/posts/0-9-final-beta-cycle.md new file mode 100644 index 0000000000..6916d901a4 --- /dev/null +++ b/web/content/blog/posts/0-9-final-beta-cycle.md @@ -0,0 +1,18 @@ +--- +title: 'Wheels 0.9: The Final Final Beta Cycle' +slug: 0-9-final-beta-cycle +publishedAt: '2009-12-04T21:05:40.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We're happy to announce a significant maintenance release of Wheels: version + 0.9(http://www.cfwheels.com/download). We're also running out of decimal + points on the way to 1.0. I don't think we'll d... +coverImage: null +legacyId: '8' +--- + +We're happy to announce a significant maintenance release of Wheels: [version 0.9](http://www.cfwheels.com/download). We're also running out of decimal points on the way to 1.0. I don't think we'll do anything cheap like version 0.10. :) Consider this the final beta cycle. I asked Per how many bugs were fixed in this release, and he answered, "Tons." Many of these bugs were reported by the community, which is an amazing thing to see. The success of this framework is being built on top of direct feedback from _you_. Many thanks! I'd also like to announce that we've added Raúl Riera to our core team of contributors. Raúl has been working on an impressive [scaffolding plugin](http://scaffoldwheels.riaforge.org/) and has contributed a ton of feedback and code patches to the project. I also run across his comments all over the CFML blogosphere, championing Wheels and getting the word out. Many thanks to Per, Peter, Tony, Raúl, and everyone else who has been contributing to the project in various ways. It looks like we'll be production-ready this year! diff --git a/web/content/blog/posts/1-0-1-maintenance-release.md b/web/content/blog/posts/1-0-1-maintenance-release.md new file mode 100644 index 0000000000..cbd31e1baa --- /dev/null +++ b/web/content/blog/posts/1-0-1-maintenance-release.md @@ -0,0 +1,18 @@ +--- +title: ColdFusion on Wheels 1.0.1 Maintenance Release +slug: 1-0-1-maintenance-release +publishedAt: '2010-12-17T05:38:59.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Today, we release a minor maintenance version, ColdFusion on Wheels 1.0.1. + Download it today(https://cfwheels.org/download). There are no new features, + but everyone likes a more stable code base! F... +coverImage: null +legacyId: '45' +--- + +Today, we release a minor maintenance version, ColdFusion on Wheels 1.0.1. [Download it today](https://cfwheels.org/download). There are no new features, but everyone likes a more stable code base! For those of you upgrading from version 1.0, the path is very simple. Simply replace the wheels folder of your install with the new wheels folder from the zip file. With help from the community, we were able to identify and squash 25 bugs. All of them were minor edge cases, so most have not caused any pain whatsoever for Wheels developers. For a detailed list, refer to the CHANGELOG included with the download. For those of you looking to try out Wheels, check out our [Wheels LitePost Contest](https://cfwheels.org/blog/index.cfm/2010/1/25/Wheels-LitePost-Contest--win-Amazon-Gift-Card 'Wheels LitePost Contest - Win Amazon Gift Card') for a chance to win some Amazon dollars. Also check out some [head start screencasts](https://cfwheels.org/blog/index.cfm/2010/2/3/Wheels-LitePost-Contest-screencasts 'Wheels LitePost Learning Contest Screencasts') for the contest too. diff --git a/web/content/blog/posts/1-0-2-maintenance-release.md b/web/content/blog/posts/1-0-2-maintenance-release.md new file mode 100644 index 0000000000..d02da3a9c9 --- /dev/null +++ b/web/content/blog/posts/1-0-2-maintenance-release.md @@ -0,0 +1,18 @@ +--- +title: ColdFusion on Wheels 1.0.2 Maintenance Release +slug: 1-0-2-maintenance-release +publishedAt: '2010-12-20T05:20:09.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Peter Amiri +tags: [] +categories: + - Community +excerpt: >- + As many of you have noticed we have released a maintenance version of + ColdFusion on Wheels 1.0.2. This release comes on the heels of the 1.0.1 + release made only days ago. In fact there are no new f... +coverImage: null +legacyId: '43' +--- + +As many of you have noticed we have released a maintenance version of ColdFusion on Wheels 1.0.2. This release comes on the heels of the 1.0.1 release made only days ago. In fact there are no new features in version 1.0.2 and this release only addresses some bugs that made their way into the release cycle of 1.0.1. Almost immediately after releasing 1.0.1, we noticed something was wrong and some bugs had crept in to the code during the packaging of the release. The core team immediately set out to fix the issue and in fact had a new version of the 1.0.1 zip file on the site within an hour. We then took the new release through some more rigorous testing and eventually incremented the version number to indicate the change that had taken place. We drew straws as to who to blame but I don't remember who lost ;-). Seriously though, we only tracked six downloads of the infected 1.0.1 zip file and several of those were by the core team members. So the impact of this was probably very minimal. And yes we have taken steps to make sure it doesn't happen again. Thanks again for your continued support of the project. diff --git a/web/content/blog/posts/1-0-we-are-production-ready.md b/web/content/blog/posts/1-0-we-are-production-ready.md new file mode 100644 index 0000000000..10579351e8 --- /dev/null +++ b/web/content/blog/posts/1-0-we-are-production-ready.md @@ -0,0 +1,18 @@ +--- +title: 'Wheels 1.0: We're Production Ready' +slug: 1-0-we-are-production-ready +publishedAt: '2009-12-24T09:26:50.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We've gone 1.0! Go download ColdFusion on Wheels + 1.0(https://cfwheels.org/download) and give it a try. If you're upgrading from + a previous version, please review the instructions for Upgrading to 1... +coverImage: null +legacyId: '26' +--- + +We've gone 1.0! Go [download ColdFusion on Wheels 1.0](https://cfwheels.org/download) and give it a try. If you're upgrading from a previous version, please review the [instructions for Upgrading to 1.0](https://cfwheels.org/docs/chapter/upgrading-wheels) (even if you're upgrading from the release candidate). It's an honor for me to announce this release and to thank our passionate community. The core team and community have put a ton of hard work into this project since I started contributing in November of 2007. Per Djurner has truly done some hero work. Everyone owes him a beer. Even though [Sean Corfield claims that Wheels doesn't have much traction](http://corfield.org/blog/index.cfm/do/blog.entry/entry/On_Hal_Helms_Ruby_on_Rails_and_the_Death_of_ColdFusion_and_Fusebox), we have been overwhelmed by [the](http://twitter.com/synxer/status/5956374387) [positive](http://groups.google.com/group/cfwheels/browse_thread/thread/f3f9a91ed0415897) [feedback](http://twitter.com/rhwalt/statuses/5990048515) of the framework. I expect more to come. It's been picking up. I'm going to risk forgetting to thank someone who has helped. I'm sorry if I missed you. Thanks so much to Rob Cameron (The Godfather), Per Djurner, Tony Petruzzi, Peter Amiri, Raul Riera, James Gibson, Mike Henke, Clarke Bishop, Russ Johnson, Grant Copley, Isaac Dealey, Tom Hoen, Andy Bellenie, Milo Maneo, Louis Plante, Joshua Clingenpeel, William Fisk, and Mike Haggerty for contributing to the project in meaningful ways. (Hey, I've always wanted to release a CD with a "Thank You" section, so this will have to do. :)) Here's to a framework with a very bright future and a major contribution to the CFML community at large. diff --git a/web/content/blog/posts/1-1-1-released.md b/web/content/blog/posts/1-1-1-released.md new file mode 100644 index 0000000000..17eb2f2f71 --- /dev/null +++ b/web/content/blog/posts/1-1-1-released.md @@ -0,0 +1,30 @@ +--- +title: ColdFusion on Wheels 1.1.1 Released +slug: 1-1-1-released +publishedAt: '2010-12-21T23:10:53.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We're releasing ColdFusion on Wheels version + 1.1.1(https://cfwheels.org/download) today after identifying and fixing a few + bugs reported over the past couple weeks. The upgrade should not affect cu... +coverImage: null +legacyId: '58' +--- + +We're releasing [ColdFusion on Wheels version 1.1.1](https://cfwheels.org/download) today after identifying and fixing a few bugs reported over the past couple weeks. The upgrade should not affect current 1.1 users, so we strongly encourage that you upgrade immediately. As with all releases in the 1.x cycle, you can upgrade by replacing the wheels folder in your current application with the new one from the zip file. Here is the list of issues resolved from the [CHANGELOG](http://code.google.com/p/cfwheels/source/browse/tags/1.1.1/wheels/CHANGELOG): + +- Added number formatting on the value passed in to "count" in the pluralize() function +- Fixed renderWith() so that it works in all environment modes when returning JSON +- Fixed belongsTo association code when using composite keys +- Allow cfthread to be used in views +- Fixed paging code for non-parameterized queries +- Corrected bug in request verification when session management was disabled in Railo +- Changed "if" to "condition" (and deprecated) on all validation methods to get around the fact that "if" is a reserved word in cfscript +- Fixed autolink() so that it correctly links and escapes relative paths +- Fixed so including partials with layouts does not cause duplicated content + +Let's keep squashing these bugs, so be sure to share your experiences with the framework in the [Google Group](http://groups.google.com/group/cfwheels) and the [issue tracker](http://code.google.com/p/cfwheels/issues/list). diff --git a/web/content/blog/posts/1-1-4-released.md b/web/content/blog/posts/1-1-4-released.md new file mode 100644 index 0000000000..cb933ed2b4 --- /dev/null +++ b/web/content/blog/posts/1-1-4-released.md @@ -0,0 +1,53 @@ +--- +title: ColdFusion on Wheels 1.1.4 released +slug: 1-1-4-released +publishedAt: '2011-07-22T23:53:34.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: + - 1-1 +categories: + - Releases +excerpt: >- + Today, we're releasing ColdFusion on Wheels version + 1.1.4(https://cfwheels.org/download). This release fixes numerous bugs and + adds a nice feature: Now you no longer need to create a zip file to st... +coverImage: null +legacyId: '69' +--- + +Today, we're releasing [ColdFusion on Wheels version 1.1.4](https://cfwheels.org/download). This release fixes numerous bugs and adds a nice feature: Now you no longer need to create a zip file to start working on a new plugin. You just create a folder for it in the plugins folder and start coding your CFC. To upgrade, you just need to replace the wheels folder in your application with the new wheels folder in the [zip file](https://cfwheels.org/download). The following [changes](https://github.com/cfwheels/cfwheels/blob/v1.1.4/wheels/CHANGELOG 'Version 1.1.4 CHANGELOG') have been made for this release: + +### View Enhancements + +- Allow an array of structs to used for options in `selectTag()` +- Added `secondStep` parameter to date/time select tags + +### Model Enhancements + +- Update to `belongsTo()`, `hasOne()` and `hasMany()` for the new argument `joinKey`. +- You can pass an unlimited number properties when using dynamic finders +- Dynamic finders now support passing in an array for values +- Added the `delimiter` argument to dynamic finders, this allow you to change the delimiter +- Added `validationTypeForProperty()` method + +### Other Enhancements + +- Added proper HTTP status headers +- Plugin development no longer requires a zip file + +### Bug Fixes + +- Incorrect MIME type for JSON +- Route with format will cause exception when route is selected and format is not provided +- Raise `renderError` when template is not found for format +- `labelClass` should split up the list of classes and attach one class for each label +- Transactions would not close when used with the `dependent` argument of `hasMany()` +- Soft deletes do not work correctly with outer joins +- Better error message when supplying a query param of type string and omitting single quotes +- Allow commas in dynamic finders +- AMPM select displaying twice +- `$request` `argumentsCollection`: should be `argumentCollection` +- Pagination pull incorrect number of results with compounded keys +- Update `hasChanged()` to properly check floats +- Date tags selected date throws out of range error diff --git a/web/content/blog/posts/1-1-6-released.md b/web/content/blog/posts/1-1-6-released.md new file mode 100644 index 0000000000..5965d14958 --- /dev/null +++ b/web/content/blog/posts/1-1-6-released.md @@ -0,0 +1,36 @@ +--- +title: ColdFusion on Wheels 1.1.6 Released +slug: 1-1-6-released +publishedAt: '2011-10-20T21:57:22.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Chris Peters +tags: + - 1-1 +categories: + - Releases +excerpt: >- + Another round of enhancements and bug fixes has been fixed and incorporated + into version 1.1.6 of ColdFusion on Wheels. Download it + today(https://cfwheels.org/download) to increase the stability of... +coverImage: null +legacyId: '72' +--- + +Another round of enhancements and bug fixes has been fixed and incorporated into version 1.1.6 of ColdFusion on Wheels. [Download it today](https://cfwheels.org/download) to increase the stability of your Wheels applications. **Upgrading from 1.1.x is easy.** Download the zip file, extract it, and replace your application's wheels folder with the new wheels folder from the zip file. Read on for details from the CHANGELOG.From the [CHANGELOG](https://github.com/cfwheels/cfwheels/blob/v1.1.6/wheels/CHANGELOG) for version 1.1.6... + +### Model Enhancements + +- validatesUniquenessOf only selects primary keys - \[Jordan Clark, Don Humphreys\] + +### View Enhancements + +- Allow removal height and/or width attributes from imageTag when set to false - \[downtroden, Tony Petruzzi\] +- Allow delimiter to be specified for stylesheets and javascripts - \[Derek, Tony Petruzzi\] + +### Bug Fixes + +- hasChanged was incorrectly evaluating boolean values - \[Jordan Clark, Don Humphreys\] +- Do not perform update when no changes have been made to the properties of a model - #786 \[Mohamad El-Husseini, Tony Petruzzi\] +- OnlyPath argument of urlFor does not correctly recognise HTTPS urls - \[Andy Bellenie, Tony Petruzzi\] +- Pagination clause wasn't enclosed - \[Karl Deterville, Tony Petruzzi\] +- Pagination endrow was incorrectly calculated - \[Karl Deterville, Tony Petruzzi\] diff --git a/web/content/blog/posts/1-1-8-released.md b/web/content/blog/posts/1-1-8-released.md new file mode 100644 index 0000000000..d35b528371 --- /dev/null +++ b/web/content/blog/posts/1-1-8-released.md @@ -0,0 +1,19 @@ +--- +title: ColdFusion on Wheels 1.1.8 Released +slug: 1-1-8-released +publishedAt: '2012-05-21T23:41:08.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Chris Peters +tags: + - 1-1 +categories: + - Releases +excerpt: >- + Today, we're releasing version 1.1.8(https://cfwheels.org/download) of the + ColdFusion on Wheels framework. The new version includes bug fixes and minor + enhancements. Upgrade today for a more stable... +coverImage: null +legacyId: '74' +--- + +Today, we're releasing [version 1.1.8](https://cfwheels.org/download) of the ColdFusion on Wheels framework. The new version includes bug fixes and minor enhancements. Upgrade today for a more stable application. To upgrade from version 1.1.x, simply download the zip file and replace your application's wheels folder with the new one. For a list of fixes, see the [CHANGELOG](https://github.com/cfwheels/cfwheels/blob/1.1-release/wheels/CHANGELOG). diff --git a/web/content/blog/posts/1-1-beta-1-available.md b/web/content/blog/posts/1-1-beta-1-available.md new file mode 100644 index 0000000000..b2ef84694c --- /dev/null +++ b/web/content/blog/posts/1-1-beta-1-available.md @@ -0,0 +1,31 @@ +--- +title: ColdFusion on Wheels 1.1 Beta 1 Is Now Available +slug: 1-1-beta-1-available +publishedAt: '2010-12-10T22:25:50.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + After tons of work on some exciting new features, the core team is happy to + release the first beta of ColdFusion on Wheels + 1.1(https://cfwheels.org/download) today. Now we are turning to the commun... +coverImage: null +legacyId: '55' +--- + +After tons of work on some exciting new features, the core team is happy to release the [first beta of ColdFusion on Wheels 1.1](https://cfwheels.org/download) today. Now we are turning to the community to help us find bugs and put the new features through their paces. We need your help! Here is a taste of some of the new features: + +- [Nested properties](https://cfwheels.org/docs/1-1/chapter/nested-properties) allow you to save changes to an object and all of its children in a single call to `save()`, `create()`, or `update()`. +- All database calls are wrapped in [transactions](https://cfwheels.org/docs/1-1/chapter/transactions) by default. +- Wheels now supports [SQLite and H2](https://cfwheels.org/docs/1-1/chapter/requirements) databases. +- [Automatic validations](https://cfwheels.org/docs/1-1/chapter/object-validation) give Wheels the ability to introspect your database and automatically validate max lengths, presence of, and numericality of your data. +- You can now [respond with multiple output formats](https://cfwheels.org/docs/1-1/chapter/responding-with-multiple-formats) in a single controller action. +- [Automatic dependency handling](https://cfwheels.org/docs/1-1/chapter/associations) for your models' associated data is now available. +- [Nested layouts](https://cfwheels.org/docs/1-1/chapter/using-layouts) allow you to extend layouts and keep your view code DRY. +- A testing framework for your applications and plugins. (Documentation and details coming soon.) +- [cfwheels.org](../../) now allows you to browse reference guides and API documentation for both [1.0.x](../../docs/1-0) and [1.1.x](../../docs/1-1) versions of Wheels (and beyond). +- Many other major and minor improvements. See the [changelog](http://code.google.com/p/cfwheels/source/browse/trunk/wheels/CHANGELOG) for more details. + +The core team will be fixing bugs and improving documentation over the next few weeks. We appreciate any feedback that you can give us in the [Google Group](http://groups.google.com/group/cfwheels) or the [issue tracker](http://code.google.com/p/cfwheels/issues/list). We have started a chapter in the docs on [upgrading from 1.0.x to 1.1.x](https://cfwheels.org/docs/1-1/chapter/upgrading-wheels) and will be adding to the instructions as we run across more gotchas. Now let's get going on continuing to improve the best ColdFusion framework out there! diff --git a/web/content/blog/posts/1-3-0-released.md b/web/content/blog/posts/1-3-0-released.md new file mode 100644 index 0000000000..3999deb5e2 --- /dev/null +++ b/web/content/blog/posts/1-3-0-released.md @@ -0,0 +1,26 @@ +--- +title: CFWheels 1.3.0 released +slug: 1-3-0-released +publishedAt: '2014-08-06T23:21:11.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Chris Peters +tags: + - 1-3 +categories: + - Releases +excerpt: >- + After a couple years of work on version 1.2 of CFWheels, we decided to reboot + our efforts and simplify. To mark this new milestone, we are releasing + CFWheels version 1.3.0(https://cfwheels.org/down... +coverImage: null +legacyId: '76' +--- + +After a couple years of work on version 1.2 of CFWheels, we decided to reboot our efforts and simplify. To mark this new milestone, we are releasing [CFWheels version 1.3.0](https://cfwheels.org/download) today. Version 1.3.0 includes many back-ported commits from the 1.2 branch but aims to be a non-breaking upgrade. If you're upgrading, review the [instructions for upgrading](https://cfwheels.org/docs/1-3/chapter/upgrading-wheels) and enjoy some new improvements: + +- Form and view helpers are now more HTML5-friendly. (See the _HTML5 `data` Attributes_ section of [Form Helpers and Showing Errors](https://cfwheels.org/docs/1-3/chapter/form-helpers-and-showing-errors).) +- You can now create model components that don't need a database table behind them. (See the _Models Without Database Tables_ section of [Object Relational Mapping](https://cfwheels.org/docs/1-3/chapter/object-relational-mapping).) +- Application reloading and startup is now thread-safe. +- 49 new features and bugs were fixed. See the [CHANGELOG](https://github.com/cfwheels/cfwheels/blob/master/wheels/CHANGELOG). + +Give 1.3 a spin and [submit an issue](https://github.com/cfwheels/cfwheels/issues) if you find any bugs. Some plugins may need to be updated, so be sure to work with plugin authors to get 1.3 compatibility going. There are more exciting changes coming for and from our community. Thank you for your support! diff --git a/web/content/blog/posts/1-3-1-maintenance-release.md b/web/content/blog/posts/1-3-1-maintenance-release.md new file mode 100644 index 0000000000..5116ad73ba --- /dev/null +++ b/web/content/blog/posts/1-3-1-maintenance-release.md @@ -0,0 +1,25 @@ +--- +title: CFWheels 1.3.1 maintenance release +slug: 1-3-1-maintenance-release +publishedAt: '2014-08-25T21:22:49.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Chris Peters +tags: + - 1-3 +categories: + - Releases +excerpt: >- + We have fixed a few bugs discovered by the community after releasing CFWheels + 1.3.0 a few weeks ago and packaged them as version 1.3.1. Behold the major + fixes released in version 1.3.1(https://cfwh... +coverImage: null +legacyId: '77' +--- + +We have fixed a few bugs discovered by the community after releasing CFWheels 1.3.0 a few weeks ago and packaged them as version 1.3.1. Behold the major fixes released in [version 1.3.1](https://cfwheels.org/download): + +- Fixed issue with calling `addFormat()` on application start-up. +- Fixed so that Railo outputs IDs for nested properties as integers instead of exponents. +- Make sure that IDs for nested properties are unique. + +See the [v1.3.1 CHANGELOG](https://github.com/cfwheels/cfwheels/blob/v1.3.1/wheels/CHANGELOG) for a full record of all changes. To upgrade from 1.3.0, replace the `wheels` folder in your application with the new one from the zip file. See the [instructions](https://cfwheels.org/docs/1-3/chapter/upgrading-wheels) if you're upgrading from an earlier release. Keep rocking, CFWheels community! \\m/ diff --git a/web/content/blog/posts/1-3-2-maintenance-release.md b/web/content/blog/posts/1-3-2-maintenance-release.md new file mode 100644 index 0000000000..54fbd9661d --- /dev/null +++ b/web/content/blog/posts/1-3-2-maintenance-release.md @@ -0,0 +1,32 @@ +--- +title: CFWheels 1.3.2 maintenance release +slug: 1-3-2-maintenance-release +publishedAt: '2014-11-12T01:04:33.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Chris Peters +tags: + - 1-3 +categories: + - Releases +excerpt: >- + Today we release the second maintenance release in the 1.3.x series. Download + version 1.3.2(https://cfwheels.org/download) to fix the following bugs: +coverImage: null +legacyId: '78' +--- + +Today we release the second maintenance release in the 1.3.x series. [Download version 1.3.2](https://cfwheels.org/download) to fix the following bugs: + +- Fixed regression bug with setting unique id for nested properties +- Fixed reversed usage for setting option text/value when passing in an array of structs to `select()` / selectTag() +- Tableless models should not require `dataSourceName` - #351 +- Fixed issue with using group by with calculated properties - #89 +- Fixed ORM incorrectly parsing a property value as `NULL` - #209 +- Fixed bug with application scope when sharing name across applications - #359 +- Fix for removing `AS` from `ORDER BY` clause in Microsoft SQL Server - #132 +- Calling `valid()` will now correctly validate all associations when using nested properties - #284 +- Fixed issue with `save()`causing callbacks to run twice when using nested properties - #284 +- Fixed race condition issue with caching - #376 +- Fixed number parsing in `WHERE` strings + +More info in the [1.3.2 CHANGELOG](https://github.com/cfwheels/cfwheels/blob/v1.3.2/wheels/CHANGELOG). If you're upgrading from 1.3.0+, you just need to replace the `wheels` folder with the new one from the download. If you're upgrading from an older version of CFWheels, see the [instructions](https://cfwheels.org/docs/1-3/chapter/upgrading-wheels). diff --git a/web/content/blog/posts/1-3-3-maintenance-release.md b/web/content/blog/posts/1-3-3-maintenance-release.md new file mode 100644 index 0000000000..e42c6582a9 --- /dev/null +++ b/web/content/blog/posts/1-3-3-maintenance-release.md @@ -0,0 +1,25 @@ +--- +title: CFWheels 1.3.3 maintenance release +slug: 1-3-3-maintenance-release +publishedAt: '2015-02-02T23:42:45.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Chris Peters +tags: + - 1-3 +categories: + - Releases +excerpt: >- + Today, we release the third maintenance release in the 1.3.x series. Download + version 1.3.3(https://cfwheels.org/download) to fix the following bugs: +coverImage: null +legacyId: '79' +--- + +Today, we release the third maintenance release in the 1.3.x series. [Download version 1.3.3](https://cfwheels.org/download) to fix the following bugs: + +- Correct output of boolean HTML attributes using new global `booleanAttributes` setting +- Make sure locks cannot be affected by other applications running on the same server +- Fixed bug with updating an integer column from `NULL` to `0` +- Fixed potential permissions issue when running on shared hosting + +More info in the [1.3.3 CHANGELOG](https://github.com/cfwheels/cfwheels/blob/v1.3.3/wheels/CHANGELOG). If you're upgrading from 1.3.0+, you just need to replace the `wheels` folder with the new one from the download. If you're upgrading from an older version of CFWheels, see the [instructions](https://cfwheels.org/docs/1-3/chapter/upgrading-wheels). diff --git a/web/content/blog/posts/10-years-of-cfwheels-welcome-adam-cfwheels-2-x.md b/web/content/blog/posts/10-years-of-cfwheels-welcome-adam-cfwheels-2-x.md new file mode 100644 index 0000000000..ff2744f553 --- /dev/null +++ b/web/content/blog/posts/10-years-of-cfwheels-welcome-adam-cfwheels-2-x.md @@ -0,0 +1,34 @@ +--- +title: 10 years of CFWheels / Welcome Adam / CFWheels 2.x +slug: 10-years-of-cfwheels-welcome-adam-cfwheels-2-x +publishedAt: '2016-03-23T19:55:11.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: [] +categories: + - Community +excerpt: >- + A bit of history: It's slightly hard to put an exact date on it, but this year + (probably) celebrates 10 years of CFWheels! Obviously, in the internet age, 10 + years is an awfully long time. The firs... +coverImage: null +legacyId: '85' +--- + +**A bit of history:** It's slightly hard to put an exact date on it, but this year (probably) celebrates 10 years of CFWheels! Obviously, in the internet age, 10 years is an awfully long time. The first mention I can find if from [Pete Freitag's "Get Wheelin" blog post](http://www.petefreitag.com/item/493.cfm) celebrating CFWheels 0.1 in November 2005. Rob Cameron, the original author moved over to Rails full time a few years later: you can catch up with him at [http://ridingtheclutch.com/](http://ridingtheclutch.com/). Over the years there have been a lot of contributors - whilst our GitHub repo hasn't quite got that (very) early history, since Jul 23, 2006, we've had: + +- 2825 commits (Per Djurner has the dubious claim to fame of the first commit, and at time of writing, the most recent too :)) +- 22 Branches +- 43 Releases +- 76 forks +- 453 issues + +Whilst there was a "bit of a break" around 2012/13, Wheels has been going from strength to strength. Contributors have changed and moved on, and so have core team members. Our thanks go out to all of them! **Welcome Adam!** We're very pleased that Adam Chapman (@chapmandu) has agreed to join the CFWheels core team! He’s been a long-time supporter of wheels, we're very glad to have him on board. We expect great things AC.... great things. :) You can find [Adam's blog here.](http://chapmandu.com/) **CFWheels 2.x:** Lots of chat at the moment about the next major release of CFWheels - please do get involved on the Google group if you've got ideas. At the moment, amongst lots of micro improvements, we're looking at: + +- integrating the ColdRoute plugin into the core:  ColdRoute allows you to define RESTful resources through new expressive routing helpers and controller conventions. It also allows you to organize controllers and views into subfolders via "namespaces" or "modules." +- improving wheels as a true RESTful service provider: you can already return JSON, XML and lots of other good stuff, but we're looking to improve things like setting custom headers, and really controlling your APIs response +- improving the plugin architecture, and generally looking a more "modular" way of doing things. +- dropping CF8/9 support; dropping Railo (as you should all be on [Lucee](http://lucee.org) now!!) +- better Commandbox support: we'll be looking at CLI type stuff to make getting going with wheels even quicker. + +Got an idea? Get on the [Google Group](https://groups.google.com/forum/?fromgroups#!forum/cfwheels) and let us know! diff --git a/web/content/blog/posts/andy-bellenie-joins-core-team.md b/web/content/blog/posts/andy-bellenie-joins-core-team.md new file mode 100644 index 0000000000..e595ca7a52 --- /dev/null +++ b/web/content/blog/posts/andy-bellenie-joins-core-team.md @@ -0,0 +1,18 @@ +--- +title: Andy Bellenie Joins the Core Team +slug: andy-bellenie-joins-core-team +publishedAt: '2010-12-03T05:44:14.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + The core team(https://cfwheels.org/community/core-team) has been impressed + with the work that Andy Bellenie(https://cfwheels.org/user/profile/24) has + been contributing to the core and community for... +coverImage: null +legacyId: '24' +--- + +The [core team](https://cfwheels.org/community/core-team) has been impressed with the work that [Andy Bellenie](https://cfwheels.org/user/profile/24) has been contributing to the core and community for quite some time. So we extended an invitation for him to be the a part of the team, and he said yes. Andy is very talented and definitely has opinions about the "right way" of doing things. In fact, we couldn't see why he shouldn't be a part of the team. Please join us in congratulating Andy. We're glad to have you on board officially! diff --git a/web/content/blog/posts/andy-bellenie-to-speak-at-scotch-on-the-rocks-2013.md b/web/content/blog/posts/andy-bellenie-to-speak-at-scotch-on-the-rocks-2013.md new file mode 100644 index 0000000000..e5bd3fa900 --- /dev/null +++ b/web/content/blog/posts/andy-bellenie-to-speak-at-scotch-on-the-rocks-2013.md @@ -0,0 +1,18 @@ +--- +title: Andy Bellenie to speak at Scotch on the Rocks 2013 +slug: andy-bellenie-to-speak-at-scotch-on-the-rocks-2013 +publishedAt: '2013-04-24T18:15:04.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Andy Bellenie +tags: [] +categories: + - Community +excerpt: >- + Core team member Andy Bellenie is presenting at the Scotch on the Rocks + conference this year, held 6-7 June in Edinburgh, Scotland. There's an great + set of speakers lined up, including Ray Camden (... +coverImage: null +legacyId: '75' +--- + +Core team member Andy Bellenie is presenting at the Scotch on the Rocks conference this year, held 6-7 June in Edinburgh, Scotland. There's an great set of speakers lined up, including Ray Camden (Adobe), Luis Majano (Coldbox), Matt Gifford, Mike Henke, Bruce Lawson (Opera), Guust Nieuwenhuis and many more, not to mention Andy Allan and the guys from Fuzzy Orange who make it all possible. Andy will be presenting a talk on the use of mindfulness-meditation as a technique for both professional and personal development. He'll also be flying the flag for CFWheels at the conference and will run a BOF session for newbies and pros alike. More info on his talk can be found here: [http://www.sotr.eu/index.cfm/main/presentation/by/andy_bellenie](http://www.sotr.eu/index.cfm/main/presentation/by/andy_bellenie) And the main conference site is here: [http://www.sotr.eu/](http://www.sotr.eu/) diff --git a/web/content/blog/posts/another-great-cf-objective-is-over-wheels.md b/web/content/blog/posts/another-great-cf-objective-is-over-wheels.md new file mode 100644 index 0000000000..5d0d60e18d --- /dev/null +++ b/web/content/blog/posts/another-great-cf-objective-is-over-wheels.md @@ -0,0 +1,18 @@ +--- +title: Another great cf.Objective() is over - Wheels +slug: another-great-cf-objective-is-over-wheels +publishedAt: '2010-12-27T00:59:44.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + Well, another great cf.Objective()(http://cfobjective.com/) is over. I am + still in overdrive, so it is perfect time to post about the Wheels + presentation. The first part focused on the ideas behind... +coverImage: null +legacyId: '52' +--- + +Well, another great [cf.Objective()](http://cfobjective.com/) is over.  I am still in overdrive, so it is perfect time to post about the Wheels presentation. The first part focused on the ideas behind Wheels.  [Convention Over Configuration](http://en.wikipedia.org/wiki/Convention_over_configuration) (CoC), [Don't Repeat Yourself](http://en.wikipedia.org/wiki/Don't_repeat_yourself) (DRY), and [Model View Controller](http://en.wikipedia.org/wiki/Model–view–controller) (MVC), and Simplicity. The second part, went over how Wheels works, server request are handled, understanding the Operation Trail (URL), and the File Structure.  This part we started by creating the normal, say controller, hello action but starting from the view, then working to the controller.  This was done to show how easy prototyping can be accomplished. The next part, we worked on the Controller, View, and Model aspects of Wheels. This was helped by the [scaffolding plugin](https://cfwheels.org/plugins/listing/9).  We showed [findOne()](https://cfwheels.org/docs/function/findone) vs [findAll()](https://cfwheels.org/docs/function/findall), and how to use their attributes to generate more complex sql. For the View, we modified some of the views like deleting id field from the index.cfm and talked about [helpers](https://cfwheels.org/docs/chapter/date-media-text-helpers). For the last part, we covered [Associations](https://cfwheels.org/docs/chapter/associations) and [Validation](https://cfwheels.org/docs/chapter/object-validation) in the model. The audience asked great questions which is expected from cf.Objective.  It was great to see faces like [Sean Corfield](http://corfield.org) (creator of [fw1](http://fw1.riaforge.org/)), [Mark Mandel](http://www.compoundtheory.com) (creator of [Transfer](http://www.transfer-orm.com/)), [John Mason](http://www.codfusion.com/blog/), [Andy Mathews](http://www.andymatthews.net/) (I am pretty sure he was in the far back), and [Dan Wilson](http://www.nodans.com) (managing director of [model glue](http://www.model-glue.com/)) in the crowd learning about Wheels.  I think it is really great other cf frameworks can gleam ideas from each other and maybe even help each other out. Like mentioned at the beginning of the presentation, I haven't contributed any code to the Wheels project except for a couple plugins.  I can't take credit for any their hard work.  I am someone who found a framework that works for  me after a long journey of trying cf frameworks.  Kudos to the [Core Wheels](https://cfwheels.org/community/core-team) development team and any others who have submitted code. As for the [free t-shirts](https://cfwheels.org/blog/wheels-blog-badges-wallpaper-t-shirts/), we gave them all away but have had requests for more so we maybe able to work something out. I'll post the code links later. Slides - [http://bit.ly/9nvTA1]() (has recent speaker notes) []()Outline - [http://bit.ly/cngIZQ](http://bit.ly/cngIZQ) [](http://bit.ly/cngIZQ)Speaker Notes - [http://bit.ly/bGEl82](http://bit.ly/bGEl82) (speaker notes not recent) Final Code Examples: [http://bit.ly/dlbnJv](http://bit.ly/dlbnJv) diff --git a/web/content/blog/posts/apologies-duplicate-entries-rss.md b/web/content/blog/posts/apologies-duplicate-entries-rss.md new file mode 100644 index 0000000000..574aa8d954 --- /dev/null +++ b/web/content/blog/posts/apologies-duplicate-entries-rss.md @@ -0,0 +1,18 @@ +--- +title: Apologies for Duplicate Entries in RSS +slug: apologies-duplicate-entries-rss +publishedAt: '2009-12-24T21:03:31.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + I switched the domain for CFWheels.com to CFWheels.org yesterday (We're not + trying to make money from you, after all.) As a result of this URL switch, + FeedBurner reposted the last 10 blog entries a... +coverImage: null +legacyId: '38' +--- + +I switched the domain for CFWheels.com to CFWheels.org yesterday (We're not trying to make money from you, after all.) As a result of this URL switch, FeedBurner reposted the last 10 blog entries as new posts. You may safely ignore the flood of "new" posts if you would like. Sorry for the confusion that I may have caused. Blunder alert! diff --git a/web/content/blog/posts/associations-chapter-in-documentation.md b/web/content/blog/posts/associations-chapter-in-documentation.md new file mode 100644 index 0000000000..c1bc7bc954 --- /dev/null +++ b/web/content/blog/posts/associations-chapter-in-documentation.md @@ -0,0 +1,22 @@ +--- +title: Associations Chapter in Documentation +slug: associations-chapter-in-documentation +publishedAt: '2009-12-07T21:01:37.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + A big part of Wheels's included ORM is its use of associations to describe + relationships between models. It's been a long time coming, but we released a + chapter in the Docs about associations(https... +coverImage: null +legacyId: '7' +--- + +A big part of Wheels's included ORM is its use of _associations_ to describe relationships between models. It's been a long time coming, but we released a [chapter in the Docs about associations](https://cfwheels.org/docs/chapter/associations 'Associations') along with the 0.9.1 release of ColdFusion on Wheels. Associations allow you to join data together in dynamic ways without needing to write any SQL. For example, once you define in your models that a user "has many" group memberships, you can make calls like this to obtain a query object containing the user's group memberships: + + + +This is a very small taste of what associations can do for you. Be sure to [read the chapter](https://cfwheels.org/docs/chapter/associations 'Associations') to learn all about setting up associations and what's possible. diff --git a/web/content/blog/posts/behind-the-scenes-how-a-single-commit-becomes-a-running-application-across-40-configurations.md b/web/content/blog/posts/behind-the-scenes-how-a-single-commit-becomes-a-running-application-across-40-configurations.md new file mode 100644 index 0000000000..1748a4e851 --- /dev/null +++ b/web/content/blog/posts/behind-the-scenes-how-a-single-commit-becomes-a-running-application-across-40-configurations.md @@ -0,0 +1,28 @@ +--- +title: >- + Behind the Scenes: How a Single Commit Becomes a Running Application Across + 40+ Configurations +slug: >- + behind-the-scenes-how-a-single-commit-becomes-a-running-application-across-40-configurations +publishedAt: '2026-03-03T14:00:00.000Z' +updatedAt: '2026-03-04T00:51:33.101Z' +author: Peter Amiri +tags: + - ci-cd + - docker + - github-actions + - deployment + - devops + - docker-swarm +categories: + - Website + - Tutorials +excerpt: >- + When a developer opens a pull request against the Wheels framework, it kicks + off one of the most comprehensive CI/CD pipelines you'll find in any + open-source project. Whether you're a first-time co... +coverImage: null +legacyId: '1151026256903536642' +--- + +When a developer opens a pull request against the Wheels framework, it kicks off one of the most comprehensive CI/CD pipelines you'll find in any open-source project. Whether you're a first-time contributor fixing a typo or a core maintainer shipping a new feature, the moment your PR hits the \`develop\` branch, the same gauntlet runs: dozens of engine and database combinations are tested, four distinct packages are built and published to a package registry, documentation is synced, container images are built, and a production Docker Swarm deployment rolls out -- all without a single manual intervention. You don't need commit access to trigger this. You just need a pull request. This is the story of how that sausage gets made. ## The Scale of the Problem Wheels is a Rails-inspired MVC framework for CFML (ColdFusion Markup Language). Unlike most frameworks that target a single runtime, Wheels supports \*\*eight different server engines\*\* -- Lucee 5, 6, and 7, Adobe ColdFusion 2018, 2021, 2023, and 2025, and the new BoxLang runtime. It also supports \*\*six different databases\*\*: MySQL, PostgreSQL, SQL Server, H2, Oracle, and SQLite. That matrix creates over 40 unique test configurations. Every one of them runs on every commit to the development branch. There are no shortcuts. ## Stage 1: The Test Matrix When a commit lands on the \`develop\` branch, GitHub Actions fires the \`snapshot.yml\` workflow, which immediately calls a reusable \`tests.yml\` workflow. This is where things get interesting. The test matrix spins up parallel jobs for each valid engine-and-database combination. Some pairs are excluded -- Adobe 2018 doesn't support SQLite, for example -- but the remaining combinations all run simultaneously. Each job follows the same sequence: 1. \*\*Start the CFML engine container\*\* on a dedicated port (Lucee 5 gets port 60005, Adobe 2023 gets 62023, and so on) 2. \*\*Start the database container\*\* (except for embedded databases like H2 and SQLite) 3. \*\*Wait for both services\*\* with retry logic to handle cold-start delays 4. \*\*Patch compatibility files\*\* where needed -- Oracle on Adobe engines requires a serialization filter update 5. \*\*Install engine-specific packages\*\* via the CFML package manager 6. \*\*Execute the full test suite\*\* via HTTP, passing the database type as a parameter 7. \*\*Capture and upload results\*\* as JSON artifacts with detailed workflow logs Each engine gets its own purpose-built Docker image. The Lucee images include H2, Oracle JDBC extensions, and SQLite drivers. The Adobe images handle their own package management quirks. BoxLang runs on its own runtime entirely. The test infrastructure treats each engine as a first-class citizen, not an afterthought. If even one of those 40+ jobs fails, the pipeline stops. Nothing gets published until the entire matrix is green. ## Stage 2: Four Packages, One Pipeline Once the test matrix passes, the release pipeline takes over. Wheels isn't distributed as a single monolithic package -- it's split into four distinct artifacts, each with its own purpose: - \*\*Wheels Core\*\*: The framework engine itself -- routing, ORM, controllers, views, and the internal machinery - \*\*Wheels Base Template\*\*: The application scaffold that developers start new projects from - \*\*Wheels CLI\*\*: Command-line tooling for scaffolding, migrations, and development workflows - \*\*Wheels Starter App\*\*: A ready-to-run example application for learning Each package has its own preparation script that assembles the right files, replaces version placeholders (like \`@build.version@\` and \`@build.number@\`), and structures the output for publishing. The version string itself carries meaning: \`3.0.0\` is a stable release, \`3.0.0-rc.1\` is a release candidate, and \`3.0.0-SNAPSHOT\` marks bleeding-edge development builds. A build number suffix (e.g., \`+1234\`) tracks the exact CI run. After preparation, each package goes through validation -- checking that \`box.json\` manifests parse correctly, file counts match expectations, and version strings are consistent. Only then does the pipeline authenticate with ForgeBox (the CFML package registry) and publish all four packages. The pipeline also builds ZIP archives with MD5 and SHA512 checksums, uploading them as GitHub Actions artifacts and attaching them to GitHub Releases with auto-generated release notes pulled from the changelog. ## Stage 3: Documentation Sync In parallel with package publishing, the pipeline syncs framework documentation to the community website. A dedicated \`docs-sync.yml\` workflow checks out both the framework repository and the website repository, then uses \`rsync\` to synchronize: - \*\*Guide content\*\* (Markdown files) flows from the framework's \`docs/src/\` directory into the website's versioned guides path - \*\*Image assets\*\* are copied additively so that old screenshots aren't accidentally removed - \*\*API documentation\*\* (JSON) is synced to the website's public directory for the interactive API browser If any files changed during the sync, the workflow commits and pushes to the website repository automatically. This triggers the next stage. ## Stage 4: Container Build When the website repository receives a push to \`main\` -- whether from a documentation sync or a direct code change -- the \`swarm-deploy.yml\` workflow fires. This is where the application becomes a container. The build job runs on a standard GitHub-hosted Ubuntu runner. It generates an environment file from GitHub Secrets containing database credentials, SMTP configuration for transactional email, a Sentry DSN for error tracking, and various application secrets. It installs CommandBox (the CFML build tool), pulls all dependencies, and builds a Docker image. The base image is \`ortussolutions/commandbox:lucee6\`, which provides a Lucee 6 runtime managed by CommandBox. The Dockerfile layers on a PostgreSQL JDBC driver, copies the application code, and includes a production-tuned \`server.json\` that configures JVM heap sizes, connection pools, and the server warmup sequence. The resulting image gets tagged twice -- once with \`:latest\` and once with the Git commit SHA for traceability -- then pushed to GitHub Container Registry (GHCR). ## Stage 5: Swarm Deployment The final stage runs on a self-hosted GitHub Actions runner that lives inside the Docker Swarm cluster itself. This runner authenticates with GHCR, pulls the freshly-built image, and executes \`docker stack deploy\`. The Swarm configuration deploys \*\*three replicas\*\* of the application behind a Traefik reverse proxy. Rolling updates proceed one replica at a time with a 15-second delay between each, using a start-first strategy -- meaning the new container must be healthy before the old one is removed. This ensures zero-downtime deployments. Each replica is allocated up to 2 CPUs and 4 GB of memory, with reserved minimums of 0.25 CPUs and 1 GB to guarantee baseline performance. The JVM is tuned with a 2 GB minimum and 3 GB maximum heap, sized to fit comfortably within the container's memory limit. Sessions are stored in the database with clustering enabled, so any replica can serve any request -- no sticky sessions required. Traefik handles load balancing and TLS termination, while a Cloudflare tunnel provides the public-facing edge with DDoS protection and global CDN caching. Shared storage volumes backed by CephFS allow all three replicas to access the same uploaded images, file attachments, generated sitemaps, and documentation content. This is critical -- without shared storage, a file uploaded through one replica would be invisible to the others. ## The Full Picture Here's what happens in the roughly 15-20 minutes between a developer pushing to \`develop\` and the changes being live: \`\`\` git push origin develop | v GitHub Actions: snapshot.yml | v 40+ parallel test jobs (8 engines x 6 databases) | v (all green) +---> Package 4 artifacts (core, base, cli, starter-app) +---> Validate and publish to ForgeBox +---> Upload to GitHub Releases with checksums +---> Sync documentation to wheels.dev repo | v wheels.dev repo receives push | v Build Docker image on ubuntu-latest | v Push to GitHub Container Registry | v Self-hosted runner deploys to Docker Swarm | v 3 replicas with rolling updates | v Live at wheels.dev \`\`\` ## Why This Matters For a framework that promises to run anywhere -- on any supported engine, against any supported database -- the CI/CD pipeline is the proof. It's not enough to claim compatibility; every commit verifies it across every combination. The four-package distribution model means developers install only what they need. The automated documentation pipeline means the website is never stale. The container-based deployment with rolling updates means releases happen without anyone noticing downtime. Is this level of orchestration overkill for an open-source CFML framework? Maybe. But for the developers who depend on Wheels in production, knowing that every commit survives a gauntlet of 40+ test configurations before it ever reaches them -- that's not overkill. That's trust. diff --git a/web/content/blog/posts/building-search-forms-with-tableless-models-in-cfwheels.md b/web/content/blog/posts/building-search-forms-with-tableless-models-in-cfwheels.md new file mode 100644 index 0000000000..fc136b4031 --- /dev/null +++ b/web/content/blog/posts/building-search-forms-with-tableless-models-in-cfwheels.md @@ -0,0 +1,287 @@ +--- +title: Building search forms with tableless models in CFWheels +slug: building-search-forms-with-tableless-models-in-cfwheels +publishedAt: '2023-11-12T19:42:55.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Chris Peters +tags: + - models +categories: + - Community + - Documentation + - Inspiration + - Tips & Tricks + - Tutorials +excerpt: >- + This blog article was originally posted on Chris' personal blog and is + republished here with his permission. +coverImage: null +legacyId: '128' +--- + +> This blog article was originally posted on Chris' personal blog and is republished here with his permission. + +In this post, I hope to persuade you that you will rarely ever need the `Tag`\-based form helpers (`textFieldTag`, `selectTag`, etc.) in your CFWheels apps ever again. + +“How?” you ask. + +The answer: through the use of a wonderful feature that we affectionately call [tableless models](http://docs.cfwheels.org/docs/object-relational-mapping#models-without-database-tables). + +## How you’re probably used to coding search forms in CFWheels + +So let’s code up an index form using the `Tag`\-based helpers that you’re probably accustomed to using in this situation. The view’s job is to display a list of `invoice` records along with a form for narrowing by start date and end date: + +``` + + +#startFormTag(route="invoices", method="get")# + #textFieldTag(name="startDate", value=params.startDate)# + #textFieldTag(name="endDate", value=params.endDate)# + #submitTag(value="Filter Invoices")# +#endFormTag()# + + + + + + + + + + + + + + + + + + +
InvoiceDateAmount
#h(id)##DateFormat(createdAt)##DollarFormat(amount)#
+ +
+``` + +This is pretty common, and I wouldn’t go as far to say that it’s wrong. + +Let’s code what we need in the controller to wire everything up. + +``` +component extends="Controller" { + function index() { + param name="params.startDate" default=""; + param name="params.endDate" default=""; + + local.where = []; + + if (IsDate(params.startDate)) { + ArrayAppend(local.where, "createdAt >= '#params.startDate#'"); + } + + if (IsDate(params.endDate)) { + local.nextDay = DateAdd("d", 1, params.endDate); + local.nextDay = DateFormat(local.nextDay, "m/d/yyyy"); + ArrayAppend(local.where, "createdAt < '#local.nextDay#'"); + } + + invoices = model("invoice").findAll(where=ArrayToList(local.where, " AND ")); + } +} +``` + +But wait! We can’t have a `startDate` that occurs after the `endDate`. We better add a check for that in the controller: + +``` +component extends="Controller" { + function index() { + param name="params.startDate" default=""; + param name="params.endDate" default=""; + + local.where = []; + + // Let's make sure the start date and end date jive. + if (IsDate(params.startDate) && IsDate(params.endDate) && params.startDate > params.endDate) { + flashInsert(error="The start date must be on or before the end date."); + } + + if (IsDate(params.startDate)) { + ArrayAppend(local.where, "createdAt >= '#params.startDate#'"); + } + + if (IsDate(params.endDate)) { + local.nextDay = DateAdd("d", 1, params.endDate); + local.nextDay = DateFormat(local.nextDay, "m/d/yyyy"); + ArrayAppend(local.where, "createdAt < '#local.nextDay#'"); + } + + invoices = model("invoice").findAll(where=ArrayToList(local.where, " AND ")); + } +} +``` + +That `index` action is getting pretty beefy at this point. And now we’re starting to validate our data in the controller, which can quickly turn into a tangled mess after we’ve added another field or two to the form. + +## Cleaning up the search form with tableless models + +As it turns out, models in CFWheels come with a bunch of really helpful methods for validating data. And even though we’re not using this form to save data to a database, we can still use the model validations to validate our data. Hooray! + +All that we need to do is create a CFC in our `models` folder that represents this particular form. The initializer will contain a call to `table(false)`, which tells CFWheels to not try to connect it to a database. + +In addition to `table(false)`, we can call all of the model validation initializers that we need to validate the data. + +Lastly, we need to create a method that validates data passed into the model and runs the query if all is well. + +Here is the finished product in `models/InvoiceSearchForm.cfc`: + +``` +component extends="Model" { + function config() { + // Make it tableless + table(false); + + // Validations + validatesFormatOf(properties="startDate,endDate", type="date", allowBlank=true); + validate("startDateBeforeEndDateValidation"); + } + + boolean function run() { + // Run validations and abort if failed. + if (!this.valid()) { + this.results = QueryNew(""); + return false; + } + + // Continue with query if validation passed. + local.where = []; + + if (IsDate(this.startDate)) { + ArrayAppend(local.where, "createdAt >= '#this.startDate#'"); + } + + if (IsDate(this.endDate)) { + local.nextDay = DateAdd("d", 1, this.endDate); + local.nextDay = DateFormat(local.nextDay, "m/d/yyyy"); + ArrayAppend(local.where, "createdAt < '#local.nextDay#'"); + } + + this.results = model("invoice").findAll(where=ArrayToList(local.where, " AND ")); + return true; + } + + private function startDateBeforeEndDateValidation() { + if (IsDate(this.startDate) && IsDate(this.endDate) && this.startDate > this.endDate) { + this.addError("startDate", "Start Date must be on or before End Date"); + } + } +} +``` + +Notice that `startDate` and `endDate` become properties on the model in the `this` scope. This allows us to validate those properties and refer to them in an object-oriented manner. + +When the `run` method is called, there will be a `results` property set on the object containing the search query. + +Next, we rewire the controller to this much simpler form: + +``` +component extends="Controller" { + function index() { + // Note that moving this into an object named `search` will change the + // `params` struct slightly. + param name="params.search.startDate" default=""; + param name="params.search.endDate" default=""; + + // We pass the `params.search` struct in as properties on the search form + // object. + search = model("invoiceSearchForm").new(argumentCollection=params.search); + + // This runs the search and adds an error message if validation fails. + if (!search.run()) { + flashInsert(error="There was an error with your search filters"); + } + } +} +``` + +Much cleaner, huh? Excluding whitespace and comments, this reduces the contents of the `index` action from 16 lines of actual code to 5. + +This methodology also improves the view because we can now use `textField` instead of `textFieldTag`, and we can display validation errors near the affected form fields: + +``` + + +#startFormTag(route="invoices", method="get")# + #textField(objectName="search", property="startDate")# + #errorMessageOn(objectName="search", property="startDate")# + + #textField(objectName="search", property="endDate")# + #errorMessageOn(objectName="search", property="endDate")# + + #submitTag(value="Filter Invoices")# +#endFormTag()# + + + + + + + + + + + + + + + + + + +
InvoiceDateAmount
#h(id)##DateFormat(createdAt)##DollarFormat(amount)#
+ +
+``` + +As a bonus, our `InvoiceSearchForm` model allows us to do things like set the labels/error message labels on the form fields using `property`, and allows us to do most of what models allow us to do: namely validations and callbacks. + +``` +component extends="Model" { + function config() { + table(false); + + // Set property labels for form fields and related error messages. + property(name="startDate", label="Start"); + property(name="endDate", label="End"); + + //... + } + + //... +} +``` + +I find this to be a nice pattern because it ties the form to the model in a fairly clean, object-oriented way: the model represents the form, so it makes sense for it to define how labels on the form should appear. + +## Other uses for tableless models + +Here are some other ideas where tableless models are a Good Idea™: + +**Authentication forms** +The model takes care of all authentication logic. + +**Password change/reset forms** +Move interface-based concepts like `validatesConfirmationOf` out of the table-based `user` model and into a tableless model. + +**Database transactions involving multiple models** +Nested properties have their limits and logic related to them can really pollute your table-based models. Handle all of the logic in a model that’s intimately involved with the form. + +**Reports** +Have you ever found yourself in a situation where you needed to run a query involving multiple database tables, but it was unclear which model to write the query in? Tableless models are a perfect way to avoid making a random decision. + +**NoSQL and API integration** +Are you saving your data somewhere other than a relational database? You can still model the business logic using CFWheels models. + +## Props + +Most of this inspiration came from a similar concept known as [Form Objects](https://robots.thoughtbot.com/activemodel-form-objects) in Ruby on Rails. (There is a great [Railscast about Form Objects](http://railscasts.com/episodes/416-form-objects)here too.) + +Also, major kudos to Tony Petruzzi for adding this awesome feature into CFWheels, which made its way into the v1.3 release. diff --git a/web/content/blog/posts/calling-all-plugin-authors-time-for-2-x-.md b/web/content/blog/posts/calling-all-plugin-authors-time-for-2-x-.md new file mode 100644 index 0000000000..fe66fff44c --- /dev/null +++ b/web/content/blog/posts/calling-all-plugin-authors-time-for-2-x-.md @@ -0,0 +1,43 @@ +--- +title: Calling all plugin authors! Time for 2.x... +slug: calling-all-plugin-authors-time-for-2-x- +publishedAt: '2017-05-18T14:32:52.000Z' +updatedAt: '2025-06-02T13:41:32.000Z' +author: Tom King +tags: + - 2-0 + - plugins +categories: [] +excerpt: >- + With CFWheels 2.0 beta around the corner, it's time to have a cold hard look + at the CFWheels plugin ecosystem. With 2.x, we've taken the opportunity to + modernise how we deal with plugins. If you're... +coverImage: null +legacyId: '89' +--- + +With CFWheels 2.0 beta around the corner, it's time to have a cold hard look at the CFWheels plugin ecosystem. With 2.x, we've taken the opportunity to modernise how we deal with plugins. If you're a plugin author who has previously released something for 1.x, you'll be pleased to hear there aren't that many changes required to get your plugins playing nicely with 2.x, but it's definitely a good time to revisit what you've got out there. + +### Introducing Forgebox.io + +One of the main problems we had previously was a lack of a centralised repository of CFwheels plugins. The old system relied on a bit too much manual updating, and over time got a little long in the tooth. So now, all plugins should be added to [forgebox.io](https://www.forgebox.io/type/cfwheels-plugins), specifically in the `CFWheels Plugins` category. If you [go and have a look now](https://www.forgebox.io/type/cfwheels-plugins), you'll see a few added by the core team as examples. Adding your plugin shouldn't be too much hard work, but it's definitely worth setting yourself up properly to publish to forgebox automatically via the commandline. There's an extensive tutorial over at [guides.cfwheels.org](https://guides.cfwheels.org/v2.0/docs/publishing-plugins) which we recommend you follow. In short, you ideally need a properly configured `box.json` file and for your plugins to use git tagged releases (ideally). If you've not installed [commandbox](https://www.ortussolutions.com/products/commandbox) and the [CFWheels CLI](https://guides.cfwheels.org/v2.0/docs/commandbox), now is definitely the time to try it! + +### Easier for other developers too + +Once your plugin is in the forgebox system, other CFWheels users can install your plugin with a single CLI command: `install slugName`; If they've got the CFWheels CLI installed, it will automatically create appropriate `.zip` files with the correct version number (which you'll have set in `box.json`) too. They'll also be able to view all existing plugins with `wheels plugins list`  making it extra quick to find the plugin they need. Dependencies are then tracked in that user's `box.json` file, so they can even distribute an app without your plugin, and then simply run `install` to go and download the correct version later: they can even update to the latest version of your plugin via the CLI too, or freeze it to a specific version. + +### Automatic Java Mappings + +One of the nice new features of 2.x is the automatic java library mappings which plugins can now take advantage of. Previously, you had to rely on the developer to manually add an entry into `this.javaSettings.loadpaths` if your plugin required use of a `.class` or `.jar` file. Now, we scan the plugin folders on startup, and automatically add any folders which contain `.jar` or `.class` files. One less step for configuration! You can see an example of this in the [CFWheels bCrypt](https://www.forgebox.io/view/cfwheels-bcrypt) plugin, which adds a quick wrapper around the bCrypt java class. + +### Don't forget your comments! + +In a previous post, we talked about the new embedded documentation: plugins can now take advantage of this. For plugin authors, we're recommending you comment all public functions - here's a quasi code example below. [https://gist.github.com/neokoenig/d149a75aa69b8cac49464ffc12f19027](https://gist.github.com/neokoenig/d149a75aa69b8cac49464ffc12f19027) The important part is the `[section: Plugins]` and `[category: Plugin Name]` part, which will automatically sort your functions in the correct place in the internal documentation. It's a good habit to get into, and will help other users of your plugin too. + +### Oh, and unit tests :) + +Don't forget to write some unit tests too (hey, don't we all do TDD?); there's been some changes to the test suite in 2.x, and writing unit tests is loads easier. More to follow on: + +1. New functions for testing in 2.x +2. Running plugin tests via command line, +3. How to add your plugin to Travis CI for continuous integration testing diff --git a/web/content/blog/posts/celebrating-20-years-of-cfwheels-a-look-back-and-a-step-forward-as-wheels-dev.md b/web/content/blog/posts/celebrating-20-years-of-cfwheels-a-look-back-and-a-step-forward-as-wheels-dev.md new file mode 100644 index 0000000000..39de7bd313 --- /dev/null +++ b/web/content/blog/posts/celebrating-20-years-of-cfwheels-a-look-back-and-a-step-forward-as-wheels-dev.md @@ -0,0 +1,58 @@ +--- +title: 'Celebrating 20 Years of CFWheels: A Look Back and a Step Forward as Wheels.dev' +slug: celebrating-20-years-of-cfwheels-a-look-back-and-a-step-forward-as-wheels-dev +publishedAt: '2025-01-04T00:10:50.000Z' +updatedAt: '2025-06-02T12:53:32.000Z' +author: Peter Amiri +tags: + - 20-years + - wheels-dev +categories: [] +excerpt: >- + !(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAB6CAYAAAAh6yE3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOy9fZheR3Un+Dv3fbvVajdCarUaWZFkjVEUWWpptbajT8ZxSB5wHCAwfARIgCEsIYQ4DMsybJaHB/N4SJYhLAOeD... +coverImage: null +legacyId: '129' +--- + +![](data:image/png;base64,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) + +As we ring in the new year, we’re thrilled to celebrate a monumental milestone: 20 years of CFWheels! This anniversary isn’t just a celebration of two decades of innovation, growth, and community; it’s also a moment to embrace the future with a new name—**Wheels.dev**. + +**A Legacy of Innovation** + +When CFWheels Beta was launched in 2005, the web development world was a vastly different place. ColdFusion was a dominant force, and frameworks like Rails were just beginning to reshape how developers approached web application development. Inspired by Rails, CFWheels set out to bring the same elegance and productivity to ColdFusion developers, becoming one of the first MVC frameworks in the ColdFusion ecosystem. + +Over the years, CFWheels has empowered countless developers to build robust, maintainable web applications. Its commitment to simplicity, convention over configuration, and an active community made it a go-to choice for many. + +**The Community: The Heart of CFWheels** + +None of this would have been possible without you—the community. From contributors who improved the framework, to developers who adopted it for their projects, to those who joined discussions and shared knowledge—you are the reason CFWheels has thrived for 20 years. + +Your passion and dedication have shaped the framework into what it is today. As we move forward, the community remains at the heart of everything we do. + +**Why the Name Change?** + +After two decades, the web development landscape has evolved dramatically, and so have we. While ColdFusion remains a core technology, the framework has grown to be more versatile and forward-thinking. The name **Wheels.dev** reflects this evolution: + +1. **Broader Appeal**: The new name positions Wheels as a modern, technology-agnostic framework that’s ready to integrate with emerging technologies. +2. **Simplicity and Clarity**: “Wheels.dev” is concise, memorable, and speaks to developers everywhere. +3. **Future-Proofing**: This change signifies our commitment to staying relevant and adaptable in the ever-changing web development world. + +**What’s Next for Wheels.dev?** + +The transition to Wheels.dev is more than just a rebranding—it’s a signal of exciting changes to come. Here’s a glimpse at what’s ahead: + +1. **Revamped Directory Structure:** The application directory structure has been modernized to adhere to best practices and more secure. +2. **Enhanced Documentation**: A revamped website with improved documentation to make onboarding and learning easier than ever. +3. **Modern Features**: Continued updates that embrace modern development practices, including support for APIs, cloud deployments, and integrations with other technologies. +4. **Community Engagement**: More opportunities to connect with fellow developers through forums, meetups, and contributions. + +## **Looking Back, Moving Forward** + +As we celebrate 20 years of innovation, we’re filled with gratitude for everything the CFWheels journey has brought us. At the same time, we’re excited to step into the future as Wheels.dev. + +To our community, past and present: thank you for believing in us, contributing to the framework, and building incredible projects with CFWheels. Together, we’ve created something truly special, and the best is yet to come. + +Here’s to the next chapter as **Wheels.dev**—building faster, smarter, and together! + +**Stay connected:** We will be building out the new site at [Wheels.dev](https://wheels.dev/) over the next few weeks, explore the new site and learn more about what’s ahead. diff --git a/web/content/blog/posts/cf-objective-2011.md b/web/content/blog/posts/cf-objective-2011.md new file mode 100644 index 0000000000..4c8ffcfcaa --- /dev/null +++ b/web/content/blog/posts/cf-objective-2011.md @@ -0,0 +1,36 @@ +--- +title: ColdFusion on Wheels at cf.Objective() 2011 +slug: cf-objective-2011 +publishedAt: '2011-03-31T21:21:50.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Events +excerpt: >- + If you're attending cf.Objective() 2011(http://www.cfobjective.com/), you'll + have a couple opportunities to learn more about ColdFusion on Wheels. You'll + also have access to a couple prominent memb... +coverImage: null +legacyId: '66' +--- + +  If you're attending [cf.Objective() 2011](http://www.cfobjective.com/), you'll have a couple opportunities to learn more about ColdFusion on Wheels. You'll also have access to a couple prominent members of the Wheels community at the conference, so be sure to say hi! + +## Wheels Events Scheduled for cf.Objective() 2011 + +### [Simplifying Development with ColdFusion on Wheels: An Introduction](https://cfwheels.org/events/listing/23) + +Speaker: [Chris Peters](https://cfwheels.org/user/profile/1) If you're new to the ColdFusion on Wheels framework and want to give it a try, then this presentation is for you. This session will cover an overview of the conventions that the framework assumes and live coding demos of the built-in ORM, controller, and view layers. Learn how features like validation, callbacks, nested properties, filters, verification, and partials help you start coding now and clean up and refactor as you go. + +### [Introducing ColdFusion On Wheels (Pre-conference)](https://cfwheels.org/events/listing/22) + +Speaker: [Mike Henke](https://cfwheels.org/user/profile/25) You’ll spend the two days working through a single concept by creating a simple blog system and learning the basics of ColdFusion On Wheels including: + +- Models, Views, and Controllers +- Data Structures & Relationships +- Routing +- Migrations +- Views with forms, partials, and helpers +- RESTful design +- Using Wheels plugins diff --git a/web/content/blog/posts/cf-objective-finale.md b/web/content/blog/posts/cf-objective-finale.md new file mode 100644 index 0000000000..6b801fd0cb --- /dev/null +++ b/web/content/blog/posts/cf-objective-finale.md @@ -0,0 +1,19 @@ +--- +title: The cf.Objective() Finale +slug: cf-objective-finale +publishedAt: '2011-05-14T22:13:39.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Events +excerpt: >- + I will be speaking at cf.Objective() + 2011(https://cfwheels.org/events/listing/23) in a little less than an hour. If + you're around, come by to get a free Wheels t-shirt! + !(https://cfwheels.org/blog/... +coverImage: null +legacyId: '67' +--- + +I will be [speaking at cf.Objective() 2011](https://cfwheels.org/events/listing/23) in a little less than an hour. If you're around, come by to get a free Wheels t-shirt! [![](https://cfwheels.org/blog/wp-content/uploads/2011/05/cfobjective-tshirt1-225x300.jpg)](https://cfwheels.org/blog/wp-content/uploads/2011/05/cfobjective-tshirt1.jpg) Awesome scotch glass logo design by the team at [Hipervinculo](http://www.hipervinculo.net/). P.S. To keep things consistent with the [CFUnited post from earlier this year](https://cfwheels.org/blog/cfunited-2010-on-wheels/), I'm attaching another blurry photo. All photos of t-shirts must look like Big Foot sightings. diff --git a/web/content/blog/posts/cf-objective-starts-and-free-t-shirts.md b/web/content/blog/posts/cf-objective-starts-and-free-t-shirts.md new file mode 100644 index 0000000000..4ef31e2574 --- /dev/null +++ b/web/content/blog/posts/cf-objective-starts-and-free-t-shirts.md @@ -0,0 +1,18 @@ +--- +title: cf.Objective starts and free t-shirts +slug: cf-objective-starts-and-free-t-shirts +publishedAt: '2010-12-22T20:23:19.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + cf.Objective()(http://cfobjective.com) starts today and goes till April 24. + The conference is being held at the Hyatt Regency Minneapolis, MN. Several + pre-conference courses were being held the las... +coverImage: null +legacyId: '51' +--- + +[cf.Objective()](http://cfobjective.com) starts today and goes till April 24. The conference is being held at the Hyatt Regency Minneapolis, MN. Several pre-conference courses were being held the last couple days. [Mike Henke](https://cfwheels.org/user/profile/25) will be presenting "[ColdFusion on Wheels, Inspired by Ruby on Rails](https://cfwheels.org/events/listing/2)" on Friday, April 23th at 4:15 in the Nicollet C room of the hotel. Find Mike at cf.Objective() and show him the wallpaper on your computer or the blog badge on your site and he’ll give you a free t-shirt while supplies last. You can see and download the different wallpaper and badges psd/jpg files [here](http://github.com/chaz-chumley/cfwheels-extras). diff --git a/web/content/blog/posts/cfmeetup-intro-wheels-orm.md b/web/content/blog/posts/cfmeetup-intro-wheels-orm.md new file mode 100644 index 0000000000..bc4fc83f0c --- /dev/null +++ b/web/content/blog/posts/cfmeetup-intro-wheels-orm.md @@ -0,0 +1,18 @@ +--- +title: CFMeetup - Intro to Wheels ORM Thurs Jan 21 6pm EST +slug: cfmeetup-intro-wheels-orm +publishedAt: '2010-12-21T06:08:25.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + What: "Intro to Wheels Object Relational Mapping (ORM)", with Mike Henke WHEN: + Thurs. Jan 21, 6:00pm US ET (UTC/GMT-5) MEETING URL: + http://experts.acrobat.com/cfmeetup/(http://experts.acrobat.com/c... +coverImage: null +legacyId: '47' +--- + +What: "Intro to Wheels Object Relational Mapping (ORM)", with Mike Henke WHEN: Thurs. Jan 21, 6:00pm US ET (UTC/GMT-5) MEETING URL: [http://experts.acrobat.com/cfmeetup/](http://experts.acrobat.com/cfmeetup/) DURATION: Approx. 1 hour Meeting will be recorded. URL will be posted after meeting at http://recordings.coldfusionmeetup.com ABOUT THIS SESSION: Our 6pm (US ET) talk on Thursday Jan 21 will be "Intro into Wheels Object Relational Mapping (ORM)", with Mike Henke. (For an introduction to CFWheels, see the recording of the talk earlier this month by Chris Peters. More at [http://www.meetup.com/coldfusionmeetup/calendar/12231118/](http://www.meetup.com/coldfusionmeetup/calendar/12231118/).) TOPIC DESCRIPTION: (provided by the speaker) An overview of Object Relational Mapping (ORM) and how is it used in Wheels. Learn how ORM simplifies your database interaction code. Mapping objects in your application to records in your database tables is a key concept in Wheels. We will take a look at exactly how this mapping is performed. diff --git a/web/content/blog/posts/cfmeetup-presentation-thursday.md b/web/content/blog/posts/cfmeetup-presentation-thursday.md new file mode 100644 index 0000000000..c3c722b561 --- /dev/null +++ b/web/content/blog/posts/cfmeetup-presentation-thursday.md @@ -0,0 +1,21 @@ +--- +title: CFMeetup Presentation this Thursday +slug: cfmeetup-presentation-thursday +publishedAt: '2010-12-11T06:21:19.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + Come hear me present on the basics of ColdFusion on Wheels on ColdFusion + Meetup(http://www.meetup.com/coldfusionmeetup/) this Thursday. The + presentation is Thursday, January 7, 2010, at 6:00 pm Eas... +coverImage: null +legacyId: '49' +--- + +Come hear me present on the basics of ColdFusion on Wheels on [ColdFusion Meetup](http://www.meetup.com/coldfusionmeetup/) this Thursday. The presentation is Thursday, January 7, 2010, at 6:00 pm Eastern Time. I just sent this description over to Charlie Arehart: Chris Peters demonstrates how to build a simple CRUD (create, read, update, delete) application using the ColdFusion on Wheels framework. By the end of the hour, you'll have a solid understanding of what it's like to build applications rapidly with Wheels. Surely, you'll be ready to give the framework a look on your own time! This is recommended for novice users, those of you who haven't had the chance to try out Wheels, disenfranchised framework users, or anyone else who wants to come heckle me in the Acrobat Connect chatroom. :) + +- [Enter the Meeting](http://experts.acrobat.com/cfmeetup/) +- [Recordings of Previous Meetings](http://recordings.coldfusionmeetup.com/) diff --git a/web/content/blog/posts/cfunited-2010-on-wheels.md b/web/content/blog/posts/cfunited-2010-on-wheels.md new file mode 100644 index 0000000000..6a1373e8e3 --- /dev/null +++ b/web/content/blog/posts/cfunited-2010-on-wheels.md @@ -0,0 +1,39 @@ +--- +title: CFUnited 2010 on Wheels +slug: cfunited-2010-on-wheels +publishedAt: '2010-12-03T21:20:38.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + As I posted + earlier(https://cfwheels.org/blog/tshirt-hosting-giveaways-cfunited/), + ColdFusion on Wheels had some community presence at CFUnited + 2010(http://cfunited.com/2010/), the final year for t... +coverImage: null +legacyId: '39' +--- + +As I [posted earlier](https://cfwheels.org/blog/tshirt-hosting-giveaways-cfunited/), ColdFusion on Wheels had some community presence at [CFUnited 2010](http://cfunited.com/2010/), the final year for the conference. There were a lot of great moments during the conference, a few of which I'll highlight in this post. + +## Wheels Highlighted in Adobe Keynote + +One of the bigger moments for me was when Adam Lehman, product manager of Adobe ColdFusion, covered the 2009 launch of ColdFusion on Wheels in Adobe's keynote. The keynote kicked off the conference. + +![](https://cfwheels.org/blog/wp-content/uploads/2010/08/wheels-adobe-keynote-1024x768.jpg) + +Our logo shined bright and proud on that slide! I know the photo is quite blurry, but it is now my personal goal for all photos of keynote appearances to look like Bigfoot sightings. + +## Familiar Faces + +One of my favorite parts of the event was running into current Wheels users. I wasn't sure what to expect, but I was pleasantly surprised to run across some familiar names. I got a chance to talk a little with [Israel Melendez](https://cfwheels.org/user/profile/70) and [Nathan Stanford](https://cfwheels.org/user/profile/148), for example. Any time that I spoke with some of the better-known CF guys, I almost always received a compliment on how impressed they were with our community and how active and passionate that it is. We should be proud of that. I know I am. We also handed out 65 Wheels t-shirts to both familiar and new faces. Talk about a good ice-breaker for a first-time conference attendee like me! + +## Presentations + +Thursday was the big day for ColdFusion on Wheels. Our birds of a feather session was well-attended, with both current Wheels users and new people interested in what the framework could do for them. Thanks Chaz and Mike for helping host it. Embedded below is the rehearsed version of the presentation that I gave about the Wheels ORM. It's a high level demo of Wheels and what it's like to work with the framework. Mike Henke also presented about Wheels and Convention over Configuration. You can download [Mike's presentation and code](http://henke.ws/post.cfm/cfunited-coldfusion-on-wheels-presentation-wrapup) on his website. + +## A Final Thank You + +This was my first CFUnited ever, and I'm glad to have experienced it before it ended. Hats off to Michael Smith, Chaz Chumley, and the rest of the CFUnited organizers for the emotional labor and sacrifice that they put into hosting and organizing the conference all of these years. diff --git a/web/content/blog/posts/cfwheels-1-4-0-released-new-documentation-too.md b/web/content/blog/posts/cfwheels-1-4-0-released-new-documentation-too.md new file mode 100644 index 0000000000..4d03dfc741 --- /dev/null +++ b/web/content/blog/posts/cfwheels-1-4-0-released-new-documentation-too.md @@ -0,0 +1,76 @@ +--- +title: 'CFWheels 1.4.0 released, New documentation too..' +slug: cfwheels-1-4-0-released-new-documentation-too +publishedAt: '2015-05-08T17:45:32.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 1-4 +categories: + - Releases + - Website +excerpt: 'First, some new announcements' +coverImage: null +legacyId: '80' +--- + +### First, some new announcements + +You may have noticed a few changes around here! With the release of 1.4, we've taken the opportunity to greatly simplify our web footprint. + +- **All documentation** now lives on [http://docs.cfwheels.org/](http://docs.cfwheels.org/) (thanks to readme.io). We hope this will allow people to more easily contribute to the fantastic documentation already there; you need a (free) readme.io account, but you should be able to 'suggest edits' for any page - feel free to help us out! We're in the process of adding redirects from the old documentation - please bear with us on this one. +- You'll notice the **plugin listings** are greatly simplified - this is a temporary measure whilst we look at the whole plugin ecosystem generally +- **Downloads** now live on the readme.io site at [http://docs.cfwheels.org/page/download](http://docs.cfwheels.org/page/download), but don't forget you can always get everything at the [Git Repo](https://github.com/cfwheels/cfwheels/releases) +- You'll notice a small change in the cfWheels logo - don't panic, you're not going mad, we just thought it might be nice to have something new and shiny to look at. +- [Tom King](http://www.oxalto.co.uk) and [Tim Badolato](https://github.com/timsayshey) are now part of the Wheels core team. "Per" still does all the actual real work :) + +### Onwards and upwards! + +1.4 is released, which brings the usual host of fixes and improvements, most noticeably a few tweaks to get Wheels running with [Lucee Server](http://luc.ee): CFWheels should now correctly identify itself as Lucee in the debug output, and various other (older) Railo specific tweaks should get applied. Note, if you're ever testing for 'railo' in the server scope on Lucee, it will return as true. A couple of other changes might catch you out too, noticeably removal of the h() function, and "development" now being the default environment mode. [Get 1.4 Now!](http://docs.cfwheels.org/v1.4/page/download) **Upgrading from 1.3x** + +- Replace the entire /wheels/ folder +- Replace URL rewriting rule files - i.e, /.htaccess, /web.config, /IsapiRewrite4.ini + +Release notes: + +**Model Enhancements** + +- Allow spaces in list passed in to the "include" argument on finders - [#150](https://github.com/cfwheels/cfwheels/issues/150) \[Per Djurner\] +- Added findOrCreateByProperty, findAllKeys(), findFirst() and findLast() finder methods - \[Per Djurner\] +- Add support for "GROUP BY" in sum(), average() etc. - [#464](https://github.com/cfwheels/cfwheels/issues/464) \[Per Djurner\] +- Made exists() check for any record when "key" and "where" is not passed in \[Per Djurner\] +- Added clearChangeInformation() for clearing knowledge of object changes - [#433](https://github.com/cfwheels/cfwheels/issues/433) \[Jeremy Keczan, Per Djurner\] +- Evaluate validation error messages at runtime - [#470](https://github.com/cfwheels/cfwheels/issues/470) \[Per Djurner\] + +**View Enhancements** + +- Respect blank "text" argument in linkTo() - [#365](https://github.com/cfwheels/cfwheels/issues/365) \[Adam Chapman, Tony Petruzzi, Per Djurner\] +- Allow styleSheetLinkTag() and JavaScriptIncludeTag() to reference files starting from the root - \[Per Djurner\] +- Added "monthNames" and "monthAbbreviations" arguments to form helpers for easy localization - \[Per Djurner\] + +**Controller Enhancements** + +- Ability to prepend functions to the filter chain instead of appending - [#321](https://github.com/cfwheels/cfwheels/issues/321) \[Per Djurner\] +- Pass in "appendToKey" to caches() to cache content separately - [#439](https://github.com/cfwheels/cfwheels/issues/439) \[Per Djurner\] +- Allow external attachments with sendEmail() - \[Adam Chapman, Tony Petruzzi\] +- Ability to redirect to a specific URL - \[Simon Allard\] +- Option to correct JSON output by passing in x="string" or x="integer" to renderWith() - \[Per Djurner\] + +**Bug Fixes** + +- Fix for blank path_info in CGI scope - [#447](https://github.com/cfwheels/cfwheels/issues/447) \[Tim Badolato, Tony Petruzzi, Per Djurner\] +- Fix for accessing request scope key that does not exist from session - [#446](https://github.com/cfwheels/cfwheels/issues/446) \[Brent Alexander, Per Djurner\] +- Removed "validate" property that was incorrectly set when calling create() - \[Per Djurner\] +- Pass through "parameterize" in exists() \[Per Djurner\] +- Do not remove "AS" when it's in the SQL for a calculated property - [#453](https://github.com/cfwheels/cfwheels/issues/453) \[Jean Duteau, Per Djurner\] +- Obfuscate parameters in named route patterns when URL rewriting is off - [#455](https://github.com/cfwheels/cfwheels/issues/455) \[Amber Cline, Per Djurner\] +- Pass through "includeSoftDeletes" argument correctly - [#451](https://github.com/cfwheels/cfwheels/issues/451) \[Jon Brose\] + +**Miscellaneous** + +- Support for the Lucee server - \[Tom King\] +- Made "development" the default environment mode - \[Per Djurner\] +- Removed deprecation work-around for the "if" argument on validation helpers - \[Per Djurner\] +- Removed deprecation work-around for the "class" argument on association initialization methods - \[Per Djurner\] +- Removed the "lib" folder - \[Per Djurner\] +- Removed the h() function, use XMLFormat() instead - \[Per Djurner\] diff --git a/web/content/blog/posts/cfwheels-1-4-1-maintenance-release.md b/web/content/blog/posts/cfwheels-1-4-1-maintenance-release.md new file mode 100644 index 0000000000..93017ae1b0 --- /dev/null +++ b/web/content/blog/posts/cfwheels-1-4-1-maintenance-release.md @@ -0,0 +1,34 @@ +--- +title: CFWheels 1.4.1 maintenance release +slug: cfwheels-1-4-1-maintenance-release +publishedAt: '2015-05-30T17:37:00.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 1-4 +categories: + - Releases +excerpt: >- + Today sees a small maintenance release for the 1.4.x series Download 1.4.1 + today(https://github.com/cfwheels/cfwheels/releases/download/v1.4.1/cfwheels.1.4.1.zip) + to fix the following: +coverImage: null +legacyId: '81' +--- + +Today sees a small maintenance release for the 1.4.x series [Download 1.4.1 today](https://github.com/cfwheels/cfwheels/releases/download/v1.4.1/cfwheels.1.4.1.zip) to fix the following: + +### Bug Fixes + +- Skip callbacks when running calculation methods  \[Adam Chapman, Per Djurner\] +- Fixed rewrite rules so base URL is rewritten correctly on Apache  \[Jeremy Keczan, Per Djurner\] +- Removed incorrect path info information set by Apache \[David Belanger, Per Djurner\] +- Fixed routing bug when running from a sub folder on Adobe ColdFusion 10 - \[Brant Nielsen, Per Djurner\] +- Made sure error emails never depend on application variables being set - \[Per Djurner\] + +### Miscellaneous + +- Removed tests folder - \[Per Djurner\] +- Updates to framework utility pages - Update logo, Fix links on congrats page to point to new documentation site - \[Chris Peters\] + +Also don't forget to check the [upgrade notes](http://docs.cfwheels.org/v1.4/docs/upgrading) diff --git a/web/content/blog/posts/cfwheels-1-4-2-maintenance-release.md b/web/content/blog/posts/cfwheels-1-4-2-maintenance-release.md new file mode 100644 index 0000000000..16a4e4b37d --- /dev/null +++ b/web/content/blog/posts/cfwheels-1-4-2-maintenance-release.md @@ -0,0 +1,44 @@ +--- +title: CFWheels 1.4.2 maintenance release +slug: cfwheels-1-4-2-maintenance-release +publishedAt: '2015-08-31T16:54:57.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 1-4 +categories: + - Releases +excerpt: >- + Today sees another maintenance release for the 1.4.x series Download 1.4.2 + today(https://github.com/cfwheels/cfwheels/releases/download/v1.4.2/cfwheels.1.4.2.zip) + to fix the following: +coverImage: null +legacyId: '82' +--- + +Today sees another maintenance release for the 1.4.x series [Download 1.4.2 today](https://github.com/cfwheels/cfwheels/releases/download/v1.4.2/cfwheels.1.4.2.zip) to fix the following: + +### Bug Fixes + +- Fix for selecting distinct with calculated property - \[Edward Chanter, Per Djurner\] +- Fixed so default values are applied to non persistent properties - #519 \[Andy Bellenie\] +- Fixed missing var scope causing error on Lucee - \[Russ Michaels, Tom King\] +- Don't show debug info on AJAX requests - #496 \[Leroy Mah, Per Djurner\] +- Fixed permissions issue with imageTag() when running on shared hosting - \[Per Djurner\] +- Removed use of ExpandPath() in debug file since it was causing file permission issues - \[Peter Hopman, Per Djurner\] +- Skip setting object property when NULL is passed in - #507 \[Andy Bellenie, Per Djurner\] +- Fixed edge case issue with calling dynamic association methods - #501 \[Dominik Hofer, Per Djurner\] +- Fixed lock name in onSessionEnd event - #499 \[Per Djurner\] +- Ignore white space in the "where" argument to finders - #503 \[Per Djurner\] +- Ignore spaces in the "keys" argument to hasManyCheckBox() and hasManyRadioButton() - \[Song Lin, Per Djurner\] +- Skip running callbacks when validating uniqueness and similar situations - #492 \[Andy Bellenie, Per Djurner\] +- Avoid plugin directory exception during first application load - #541 \[Adam Chapman, Per Djurner\] +- Fix for using cfscript operators in "condition" and "unless" argument on ACF 8 - #531 \[Per Djurner\] +- Fix for rolling back nested properties - #539 \[James Gibson, Chris Peters, Per Djurner\] +- afterSave and afterCreate callbacks are not firing on nested objects - #525 \[Adam Chapman, Chris Peters, Per Djurner\] +- Ability to pass in list to "includeBlank" argument on dateSelect() and similar functions - #502 \[Thorsten Eilers, Per Djurner\] +- Ability to set attributes on the input element created by buttonTo() - \[Per Djurner\] +- Added missing "onlyPath" argument to imageTag() - #508 \[Per Djurner\] +- Corrected output of property labels in error messages - #494 \[Andy Bellenie\] + +Also don't forget to check the [upgrade notes](http://docs.cfwheels.org/v1.4/docs/upgrading). diff --git a/web/content/blog/posts/cfwheels-1-4-3-maintenance-release.md b/web/content/blog/posts/cfwheels-1-4-3-maintenance-release.md new file mode 100644 index 0000000000..b85700d4d0 --- /dev/null +++ b/web/content/blog/posts/cfwheels-1-4-3-maintenance-release.md @@ -0,0 +1,32 @@ +--- +title: CFWheels 1.4.3 maintenance release +slug: cfwheels-1-4-3-maintenance-release +publishedAt: '2015-10-16T14:55:33.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 1-4 +categories: + - Releases +excerpt: >- + Today sees another maintenance release for the 1.4.x series Download 1.4.3 + today(https://github.com/cfwheels/cfwheels/releases/download/v1.4.3/cfwheels.1.4.3.zip) + to fix the following: +coverImage: null +legacyId: '83' +--- + +Today sees another maintenance release for the 1.4.x series [Download 1.4.3 today](https://github.com/cfwheels/cfwheels/releases/download/v1.4.3/cfwheels.1.4.3.zip) to fix the following: + +### Bug Fixes + +- Fix for using cfscript operators in condition and unless arguments. +- Added try / catch on getting host name since CreateObject("java") can be unavailable for security reasons. +- Fixed bug with cache keys always changing even though the input was the same. +- Remove white space character in output. +- Use correct path info in error email and debug area. +- Fixed plugin injection issue on start-up. +- Skip calculated properties that are aggregate SQL functions in the GROUP BY clause. +- Fixed error when trying to validate uniqueness on blank numeric properties. + +Also don't forget to check the [upgrade notes](http://docs.cfwheels.org/v1.4/docs/upgrading). diff --git a/web/content/blog/posts/cfwheels-1-4-4-maintenance-release.md b/web/content/blog/posts/cfwheels-1-4-4-maintenance-release.md new file mode 100644 index 0000000000..864e460ae7 --- /dev/null +++ b/web/content/blog/posts/cfwheels-1-4-4-maintenance-release.md @@ -0,0 +1,32 @@ +--- +title: CFWheels 1.4.4 maintenance Release +slug: cfwheels-1-4-4-maintenance-release +publishedAt: '2015-12-10T15:30:33.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 1-4 +categories: + - Releases +excerpt: >- + Today sees another maintenance release for the 1.4.x series Download 1.4.4 + today(https://github.com/cfwheels/cfwheels/releases/download/v1.4.4/cfwheels.1.4.4.zip) + to fix the following: +coverImage: null +legacyId: '84' +--- + +Today sees another maintenance release for the 1.4.x series [Download 1.4.4 today](https://github.com/cfwheels/cfwheels/releases/download/v1.4.4/cfwheels.1.4.4.zip) to fix the following: + +### Bug Fixes + +- Check global "cacheActions" setting - #572 \[Andy Bellenie, Per Djurner\] +- Fixed parsing for SQL IN parameters - #564 \[Lee Bartelme, Per Djurner\] +- Pass through all arguments properly when using findOrCreateBy - #561 \[Per Djurner\] +- Make it possible to disable session management on a per request basis - #493 \[Andy Bellenie, Per Djurner\] +- Allow mailParams to be passed through to sendEmail() - #565 \[Tom King\] +- Fixed inconsistency in form helpers for nested properties - \[Marc Funaro, Per Djurner, Chris Peters\] +- Fixed issue with grouping on associated models - \[Song Lin, Per Djurner\] +- Made the pagination() function available globally - #560 \[Chris Peters, Per Djurner\] + +Also don't forget to check the [upgrade notes](http://docs.cfwheels.org/v1.4/docs/upgrading). diff --git a/web/content/blog/posts/cfwheels-1-4-5-maintenance-release.md b/web/content/blog/posts/cfwheels-1-4-5-maintenance-release.md new file mode 100644 index 0000000000..b72de94efc --- /dev/null +++ b/web/content/blog/posts/cfwheels-1-4-5-maintenance-release.md @@ -0,0 +1,31 @@ +--- +title: CFWheels 1.4.5 maintenance Release +slug: cfwheels-1-4-5-maintenance-release +publishedAt: '2016-03-30T17:09:04.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 1-4 +categories: + - Releases +excerpt: >- + Today sees another maintenance release for the 1.4.x series Download 1.4.5 + today(https://github.com/cfwheels/cfwheels/releases/download/v1.4.5/cfwheels.1.4.5.zip) + to fix the following: +coverImage: null +legacyId: '86' +--- + +Today sees another maintenance release for the 1.4.x series [Download 1.4.5 today](https://github.com/cfwheels/cfwheels/releases/download/v1.4.5/cfwheels.1.4.5.zip) to fix the following: + +### Bug Fixes + +- Display URL correctly in error email when on HTTPS - \[Per Djurner\] +- Added the datetimeoffset data type to the Microsoft SQL Server adapter - \[Danny Beard\] +- Fix for test link display in debug footer - #588 \[Tom King\] +- Don't include query string when looking for image on file through imageTag() - \[Per Djurner\] +- Format numbers in paginationLinks() - \[Per Djurner\] +- Correct plugin filename case on application startup - #586 \[Chris Peters\] +- Clear out cached queries on reload - #585 \[Andy Bellenie\] + +Also don't forget to check the [upgrade notes](http://docs.cfwheels.org/v1.4/docs/upgrading). diff --git a/web/content/blog/posts/cfwheels-1-4-6-maintenance-release.md b/web/content/blog/posts/cfwheels-1-4-6-maintenance-release.md new file mode 100644 index 0000000000..cfbd887d53 --- /dev/null +++ b/web/content/blog/posts/cfwheels-1-4-6-maintenance-release.md @@ -0,0 +1,27 @@ +--- +title: CFWheels 1.4.6 maintenance Release +slug: cfwheels-1-4-6-maintenance-release +publishedAt: '2017-10-02T12:08:53.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 1-4 +categories: + - Releases +excerpt: >- + Today sees a maintenance release for the 1.4.x series. Please note that as 2.0 + is now released, future updates to the 1.x branch will be limited to essential + bug fixes only. Download 1.4.6 today(ht... +coverImage: null +legacyId: '94' +--- + +Today sees a maintenance release for the 1.4.x series. Please note that as 2.0 is now released, future updates to the 1.x branch will be limited to essential bug fixes only. [Download 1.4.6 today](https://github.com/cfwheels/cfwheels/releases/download/v1.4.6/cfwheels.1.4.6.zip) to fix the following: + +### Bug Fixes + +- Made humanize() keep spaces in input. +- Added spatial datatypes for MySQL. +- Scope variable to avoid object being returned as NULL. +- Include "MariaDB" in database check connection string. +- Fixes MySQL attempts to insert nulls for blank strings. diff --git a/web/content/blog/posts/cfwheels-2-0-0-beta-1-now-available.md b/web/content/blog/posts/cfwheels-2-0-0-beta-1-now-available.md new file mode 100644 index 0000000000..a37ddb9f29 --- /dev/null +++ b/web/content/blog/posts/cfwheels-2-0-0-beta-1-now-available.md @@ -0,0 +1,139 @@ +--- +title: CFWheels 2.0.0-beta.1 Now Available +slug: cfwheels-2-0-0-beta-1-now-available +publishedAt: '2017-06-01T15:20:01.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 2-0 +categories: + - Releases +excerpt: >- + It's been about a year in the making, and well over 1000 commits, but the beta + for 2.0 has now arrived! We're still catching up on the main documentation as + there's so much to cover in this release... +coverImage: null +legacyId: '92' +--- + +It's been about a year in the making, and well over 1000 commits, but the beta for 2.0 has now arrived! We're still catching up on the main documentation as there's so much to cover in this release, so bear with us a bit! In the meantime, please do check it out: + +- Direct Download: [Download zip](https://github.com/cfwheels/cfwheels/releases/download/v2.0.0-beta.1/cfwheels-2.0.0-beta.1.zip) +- Commandbox quick install : `install cfwheels@be` (Just downloads and unzips) +- Commandbox install wizard via CFWheels CLI (with url rewriting included):  `wheels new` _(make sure your version of the CLI is up to date with `install cfwheels-cli`)_ + +Make sure to check the "Breaking Changes" section below, and [please report any bugs](https://github.com/cfwheels/cfwheels/issues). + +--- + +#### Need a little help upgrading? + +There will be some more posts coming up covering some of the big topics like routing & migrations, but in the meantime: + +- Check out Adam's [upgrade advisor plugin](https://github.com/chapmandu/UpgradeAdvisor) (Commandbox: `install upgradeadvisor`) +- Get in touch via the Mailing List, Slack channel etc. + +--- + +### Changelog + +### Model Enhancements + +- Support for passing in `select=false` to `property()` to not include a calculated property by default in SELECT clauses - [#122](https://github.com/cfwheels/cfwheels/issues/122) \[Adam Chapman, Per Djurner\] +- Support for setting calculated properties to a specific data type - \[Per Djurner\] +- Support for `returnIncludedAs` and `returnIncluded` arguments to `properties()` for returning nested properties - \[Adam Chapman\] +- Support for calling `updateProperty()` with dynamic argument, e.g. `updateProperty(firstName="Per")` - \[Per Djurner\] +- Support for using boolean transaction argument, e.g. `update(transaction=false)` - [#654](https://github.com/cfwheels/cfwheels/issues/654) \[Adam Chapman\] +- Support for MariaDB - [#563](https://github.com/cfwheels/cfwheels/issues/563) \[AlexeiCF, Adam Chapman\] +- Model instance `isPersisted()` and `propertyIsBlank()` methods - [#559](https://github.com/cfwheels/cfwheels/issues/559) \[Chris Peters\] +- Database Migrations (dbmigrate) now available in the core - [#664](https://github.com/cfwheels/cfwheels/issues/664) \[Adam Chapman, Tom King, Mike Grogan\] +- Databases can now be automatically migrated to the latest version on application start - [#766](https://github.com/cfwheels/cfwheels/issues/766) \[Tom King\] +- New `timeStampMode` setting (`"utc"`, `"local"` or `"epoch"`) for the `createdAt` and `updatedAt`columns - \[Andy Bellenie\] +- Allow nested transactions - [#732](https://github.com/cfwheels/cfwheels/issues/732) \[Andy Bellenie\] +- The `handle` argument to finders now set the variable name for the query so it's easier to find in the debug output - \[Per Djurner\] +- Support added for HAVING when using aggregate functions in the `where` argument - [#483](https://github.com/cfwheels/cfwheels/issues/483) \[Per Djurner\] +- Added support for the JSON data type in the MySQL adapter - [#759](https://github.com/cfwheels/cfwheels/issues/759) \[Joel Stobart\] +- Corrected mapping for text types in the MySQL adapter - [#759](https://github.com/cfwheels/cfwheels/issues/759) \[Joel Stobart\] +- Added global setting, `lowerCaseTableNames`, to always lower case table names in SQL statements - \[Per Djurner\] + +### View Enhancements + +- `flashMessages()` are now in default layout.cfm - [#650](https://github.com/cfwheels/cfwheels/issues/650) \[Tom King\] +- Added ability to override value in `textField()`, `passwordField()` and `hiddenField()` - [#633](https://github.com/cfwheels/cfwheels/issues/633) \[Per Djurner, Chris Peters\] +- Support for the `method` argument in `buttonTo()` helper - [#761](https://github.com/cfwheels/cfwheels/issues/761) \[Adam Chapman\] + +### Controller Enhancements + +- Support for HTTP verbs, scopes, namespaces, and resources in routes (ColdRoute) \[Don Humphreys, James Gibson, Tom King\] +- Support for passing in `ram://` resources to `sendFile()` - [#566](https://github.com/cfwheels/cfwheels/issues/566) \[Tom King\] +- Extended `sendMail()` so that it can return the text and/or html content of the email - [#122](https://github.com/cfwheels/cfwheels/issues/122) \[Adam Chapman\] +- `renderWith()` can now set http status codes in header with the `status` argument - [#549](https://github.com/cfwheels/cfwheels/issues/549) \[Tom King\] +- Cross-Site Request Forgery (CSRF) protection - [#613](https://github.com/cfwheels/cfwheels/issues/613) \[Chris Peters\] +- Parse JSON body and add to params struct - \[Tom King, Per Djurner\] + +### Bug Fixes + +- Fixes skipped model instantiation due to Linux file case sensitivity - [#643](https://github.com/cfwheels/cfwheels/issues/643) \[Adam Chapman, Tom King\] +- Added spatial datatypes for MySQL - [#660](https://github.com/cfwheels/cfwheels/issues/660) \[Normal Cesar\] +- Made `humanize()` keep spaces in input - [#663](https://github.com/cfwheels/cfwheels/issues/663) \[Per Djurner, Chris Peters\] +- Avoid double redirect error when doing delayed redirects from a verification handler function - \[Per Djurner\] +- Fixes attempts to insert nulls for blank strings - [#654](https://github.com/cfwheels/cfwheels/issues/654) \[Andy Bellenie, Per Djurner\] +- Fix for using `validatePresenceOf()` with default on update - \[Andy Bellenie\] +- Fixes so paginated finder calls with no records include column names - [#722](https://github.com/cfwheels/cfwheels/issues/722) \[Per Djurner\] +- Fixes "invalid data" error when using unsigned integers in MySQL - [#768](https://github.com/cfwheels/cfwheels/issues/768) \[Per Djurner\] + +### Plugins + +- Plugins now distributed via forgebox.io \[Tom King\] +- Update to the plugin system to allow overriding of the same framework method multiple times - [#681](https://github.com/cfwheels/cfwheels/issues/681) \[James Gibson, Tom King\] +- Added ability to turn off incompatible plugin warnings from showing - \[Danny Beard\] +- Plugins now have any java lib/class files automatically mapped onApplicationStart [731](https://github.com/cfwheels/cfwheels/issues/731) \[Andy Bellenie, Tom King\] +- Plugins now read version number off their `box.json` files and are displayed in debug area [#68](https://github.com/cfwheels/cfwheels/issues/68) \[Tom King\] +- Plugin meta data as set in `box.json` now available in `application.wheels.pluginMeta` scope [#68](https://github.com/cfwheels/cfwheels/issues/68) \[Tom King\] + +### Miscellaneous + +- Redirect away after a reload request - \[Chris Peters\] +- Support checking IP in `http_x_forwarded_for` when doing maintenance mode exclusions - \[Per Djurner\] +- Support checking user agent string when doing maintenance mode exclusions - \[Per Djurner\] +- Added JUnit and JSON format test results - \[Adam Chapman\] +- Added empty application test directories - \[Chris Peters, Adam Chapman\] +- Added default `urlrewrite.xml` to support Tuckey URL rewriting with Commandbox [#649](https://github.com/cfwheels/cfwheels/issues/649) - \[Tom King\] +- Added `beforeAll()`, `afterAll()`, `packageSetup()`, `packageTeardown()` methods to test framework [#651](https://github.com/cfwheels/cfwheels/issues/651) - \[Adam Chapman\] +- Added `errorEmailFromAddress` and `errorEmailToAddress` config settings - [#95](https://github.com/cfwheels/cfwheels/issues/95) \[Andy Bellenie, Tony Petruzzi, Per Djurner\] +- Support for passing in any "truthy" value to `assert()` in tests - \[Per Djurner\] +- Added `/app/` mapping pointing to the root of the application - \[Per Djurner\] +- Added a `processRequest()` function that simplifies testing controllers - \[Per Djurner\] +- Added new embedded documentation viewer/generator for JavaDoc - [#734](https://github.com/cfwheels/cfwheels/issues/734) \[Tom King\] +- Removes all references to Railo - [#656](https://github.com/cfwheels/cfwheels/issues/656) (Adam Chapman) +- Made uncountable and irregular words configurable - [#739](https://github.com/cfwheels/cfwheels/issues/739) \[Per Djurner\] +- Removed `design` mode - \[Per Djurner\] +- Removed `cacheRoutes` setting - \[Per Djurner\] +- The `cacheFileChecking` and `cacheImages` settings are now turned off in development mode - \[Per Djurner\] +- Added `includeErrorInEmailSubject` setting - \[Per Djurner\] +- Environment switching via URL can now be turned off via `allowEnvironmentSwitchViaUrl` - [#766](https://github.com/cfwheels/cfwheels/issues/766) \[Tom King\] + +### Breaking Changes + +- Minimum Lucee version is now 4.5.5.006. +- Minimum ACF version is now 10.0.23 / 11.0.12. +- Support for Railo has been dropped. +- Rewrite and config files for IIS and Apache have been removed and has to be added manually instead. +- The `events/functions.cfm` file has been moved to `global/functions.cfm`. +- The `models/Model.cfc` file should extend `wheels.Model` instead of `Wheels` (`models/Wheels.cfc` can be deleted). +- The `controllers/Controller.cfc` file should extend `wheels.Controller` instead of `Wheels`(`controllers/Wheels.cfc` can be deleted). +- The `init` function of controllers and models should now be named `config` instead. +- The global setting `modelRequireInit` has been renamed to `modelRequireConfig`. +- The global setting `cacheControllerInitialization` has been renamed to `cacheControllerConfig`. +- The global setting `cacheModelInitialization` has been renamed to `cacheModelConfig`. +- The global setting `clearServerCache` has been renamed to `clearTemplateCache`. +- The `updateProperties()` method has been removed, use `update()` instead. +- Form labels automatically generated based on foreign key properties will drop the "Id" from the end (e.g., the label for the "userId" property will be "User", not "User Id"). +- Routes need to be updated to use the new routing system by calling `mapper()`. +- JavaScript arguments like `confirm` and `disable` have been removed from the link and form helper functions (use the [JS Confirm](https://github.com/perdjurner/cfwheels-js-confirm) and [JS Disable](https://github.com/perdjurner/cfwheels-js-disable) plugins to reinstate the old behaviour). +- Timestamping (`createdAt`, `updatedAt`) is now in UTC by default (set the global `timeStampMode`setting to `local` to reinstate the old behaviour). +- Blank strings in SQL are now converted to null checks (e.g. `where="x=''"` becomes `where="x IS NULL"`). +- Tags are now closed in HTML5 style (e.g. `` instead of ``). +- The `encode` argument to `mailTo` now encodes tag content and attributes instead of outputting JavaScript. +- Class output is now dasherized (e.g. `field-with-errors` instead of `fieldWithErrors`). +- The `renderPage` function has been renamed to `renderView`. diff --git a/web/content/blog/posts/cfwheels-2-0-1-maintenance-release.md b/web/content/blog/posts/cfwheels-2-0-1-maintenance-release.md new file mode 100644 index 0000000000..2aa5508f74 --- /dev/null +++ b/web/content/blog/posts/cfwheels-2-0-1-maintenance-release.md @@ -0,0 +1,31 @@ +--- +title: CFWheels 2.0.1 maintenance Release +slug: cfwheels-2-0-1-maintenance-release +publishedAt: '2018-01-31T19:56:48.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 2-0 +categories: + - Releases +excerpt: >- + Today sees a maintenance release for the 2.x series. Download 2.0.1 + today(https://github.com/cfwheels/cfwheels/releases/download/v2.0.1/cfwheels-2.0.1.zip) + to fix the following: +coverImage: null +legacyId: '95' +--- + +Today sees a maintenance release for the 2.x series. [Download 2.0.1 today](https://github.com/cfwheels/cfwheels/releases/download/v2.0.1/cfwheels-2.0.1.zip) to fix the following: + +### Bug Fixes + +- Fixes reload links on application test suite page - [#820](https://github.com/cfwheels/cfwheels/issues/820) \[Michael Diederich\] +- Set `dbname` in `cfdbinfo` calls when using custom database connection string - [#822](https://github.com/cfwheels/cfwheels/issues/822) \[Per Djurner\] +- Fixes `humanize()` function - [#663](https://github.com/cfwheels/cfwheels/issues/663) \[Chris Peters, Per Djurner, kmd1970\] +- Enables the `rel` attribute for `stylesheetlinkTag()` - [#834](https://github.com/cfwheels/cfwheels/pull/834) \[Michael Diederich\] +- Returning a `NULL` value from a query with NULL support enabled no longer throws an error - [#834](https://github.com/cfwheels/cfwheels/pull/834) \[Michael Diederich\] +- Accessing a route with incorrect verb now provides a more useful error message - [#800](https://github.com/cfwheels/cfwheels/issues/800) \[Tom King\] +- Fixed bug with arrays in URLs - [#836](https://github.com/cfwheels/cfwheels/issues/836) \[Michael Diederich, Per Djurner\] +- startFormTag now properly applies the method attribute - [#837](https://github.com/cfwheels/cfwheels/issues/837) \[David Paul Belanger\] +- Incompatible plugin notice now ignores patch releases unless specified - [#840](https://github.com/cfwheels/cfwheels/issues/840) \[Risto, Tom King\] diff --git a/web/content/blog/posts/cfwheels-2-0-2-security-release.md b/web/content/blog/posts/cfwheels-2-0-2-security-release.md new file mode 100644 index 0000000000..124e42bb71 --- /dev/null +++ b/web/content/blog/posts/cfwheels-2-0-2-security-release.md @@ -0,0 +1,25 @@ +--- +title: CFWheels 2.0.2 Security Release +slug: cfwheels-2-0-2-security-release +publishedAt: '2019-10-17T18:44:27.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 2-0 + - 2-0-1 +categories: + - Releases +excerpt: Today sees a security release for the 2.x series. +coverImage: null +legacyId: '103' +--- + +Today sees a security release for the 2.x series. + +It is strongly recommended to update to CFWheels 2.0.2 if you are running either 2.0.0 or 2.0.1. This issue does **not** affect 1.x releases. This release introduces a potentially breaking change, so you are encouraged to test your application appropriately before deploying. Thanks to Bryan Welter for bringing it to our attention. + +[Download 2.0.2](https://github.com/cfwheels/cfwheels/releases/download/2.0.2/cfwheels-2.0.2.zip) + +### Potential Breaking Changes + +- Blank strings in SQL are no longer converted to null diff --git a/web/content/blog/posts/cfwheels-2-0-released.md b/web/content/blog/posts/cfwheels-2-0-released.md new file mode 100644 index 0000000000..60228fb11d --- /dev/null +++ b/web/content/blog/posts/cfwheels-2-0-released.md @@ -0,0 +1,36 @@ +--- +title: CFWheels 2.0 Released +slug: cfwheels-2-0-released +publishedAt: '2017-09-30T18:25:08.000Z' +updatedAt: '2025-06-02T13:32:22.000Z' +author: Tom King +tags: + - 2-0 +categories: [] +excerpt: >- + !(https://cfwheels.org/blog/wp-content/uploads/2017/09/cfwheels-20-took-you-long-enough.jpg)(https://cfwheels.org/blog/wp-content/uploads/2017/09/cfwheels-20-took-you-long-enough.jpg) +coverImage: null +legacyId: '93' +--- + +[![](https://cfwheels.org/blog/wp-content/uploads/2017/09/cfwheels-20-took-you-long-enough.jpg)](https://cfwheels.org/blog/wp-content/uploads/2017/09/cfwheels-20-took-you-long-enough.jpg) + +Ok, it's been a while, but **finally**, CFWheels 2.0 has gone gold! + +1. Direct Download: [Download zip](https://github.com/cfwheels/cfwheels/releases/download/v2.0.0/cfwheels-2.0.0.zip) +2. Commandbox quick install : `install cfwheels` (Just downloads and unzips) +3. Commandbox install wizard via CFWheels CLI (with url rewriting included):  `wheels new` *(make sure your version of the CLI is up to date with* `_install cfwheels-cli_`_)_ + +Make sure to check the “Breaking Changes” section, and [please report any bugs](https://github.com/cfwheels/cfwheels/issues). Needless to say, this has been a massive undertaking with over 1000 commits, and over a year in the making. The core team wishes to thank all the many contributors, testers, and well, just users of the framework. We think we're in a pretty strong place to move forward with loads more exciting things in the future. For a comprehensive list of changes, check the [Changelog](https://github.com/cfwheels/cfwheels/blob/master/CHANGELOG.md), but for a quick summary: + +1. New [RESTful routing](https://guides.cfwheels.org/v2.0/docs/routing) +2. New [Database migration](https://guides.cfwheels.org/v2.0/docs/database-migrations-getting-started) system +3. New [automatically generating internal documentation](https://guides.cfwheels.org/v2.0/docs/documenting-your-code) +4. New [Plugin distribution system](https://guides.cfwheels.org/v2.0/docs/installing-and-using-plugins) via CLI and Forgebox +5. Better [commandbox integration](https://guides.cfwheels.org/v2.0/docs/commandbox) and CLI support +6. Integrated [CSRF Protection](https://guides.cfwheels.org/v2.0/docs/configuration-and-defaults#csrf-protection-settings) +7. Vastly [improved Test suite](https://guides.cfwheels.org/v2.0/docs/testing-your-application) +8. A complete rewrite of the core in cfscript, with javadoc style commenting +9. And loads more... + +Need help upgrading? Check the [upgrade notes](https://guides.cfwheels.org/v2.0/docs/upgrading), and feel free to post questions to the [Google Group](https://groups.google.com/forum/?fromgroups#!forum/cfwheels), or hit us up on the #cfwheels room on the [CFML Slack Channel](http://cfml-slack.herokuapp.com/) diff --git a/web/content/blog/posts/cfwheels-2-1-0-beta-now-available.md b/web/content/blog/posts/cfwheels-2-1-0-beta-now-available.md new file mode 100644 index 0000000000..00a6e1530a --- /dev/null +++ b/web/content/blog/posts/cfwheels-2-1-0-beta-now-available.md @@ -0,0 +1,139 @@ +--- +title: CFWheels 2.1.0-beta Now Available +slug: cfwheels-2-1-0-beta-now-available +publishedAt: '2020-02-24T17:01:37.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 2-1 +categories: + - Releases +excerpt: >- + It’s been far too long in the making, but the beta for 2.1 has now arrived! + Please do check it out: this should be considered an essential upgrade for + anyone on 2.x. A huge thanks to all have contr... +coverImage: null +legacyId: '104' +--- + +It’s been far too long in the making, but the beta for 2.1 has now arrived! Please do check it out: this should be considered an essential upgrade for anyone on 2.x. A huge thanks to all have contributed! + +- Direct Download: [Download zip](https://github.com/cfwheels/cfwheels/releases/download/v2.1.0-beta/cfwheels-2.1.0-beta.zip) + +Make sure to check the “Potenitally Breaking Changes” section below, and [please report any bugs](https://github.com/cfwheels/cfwheels/issues). + +## What's New: + +### **New GUI** + +Probably the most obvious change in 2.1 beta is the new internal user interface. Previously, Wheels internal pages like test outputs and routing tables could accidentally be broken by your app, as they extended your Controller.cfc by default. Now, they're completely isolated, and have been significantly beefed up to show everything that you might want to look at as a developer.  + +The new GUI has it's own dedicated internal routes which can be accessed directly at `/wheels/info` (assuming you've got URL rewriting on) or via the usual links in the debug footer.  + +It's made up of **six** main sections: + +- **General Wheels info** \- which displays all the settings for your development environment, such as datasources and other core configuration;    +- **a new routing table** - which includes a handy route tester as well as a quick search;    +- **improved test outputs** so you can more easily access unit tests for your app, core tests if you're on the master branch, and plugin tests if they're available;    +- **a new database migration interface**, which allows for SQL previews, so you can actually check your migration is going to do what you think it's going to do before executing;    +- **a more comprehensive documentation output**, which includes your own autogenerated application docs as well as the internal wheels function references,    +- **and a better plugins list**, showing all the information we know about any installed plugins.  + +This GUI is only available in development mode by default, but can be enabled in other modes - this isn't recommended, but it can be done if you really need to check the configuration or try and track something specific down. You can enable it via `set(enablePublicComponent=true)` in your environment specific configuration files.  + +### **Improved CORS handling** + +Next up is some much needed and improved CORS handling. CORS, or Cross-Origin Resource Sharing, will be very familiar to any of you who have a javascript component or fully fledged progressive web app which runs on one domain, but needs to get information from another. A full explanation of CORS is probably beyond the scope of this post, but if you're thinking of running your own API on a standalone domain where other applications talk to it, you'll need to be able to handle CORS. + +In Wheels 2.0, you could handle CORS requests, but they could only be configured in a very broad way. For instance, the CORS Allow Methods just returned all methods by default in an `OPTIONS` request, which kinda defeated the whole point. + +The CORS Headers -  `Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Credentials` can now be directly set by their respective functions.  + +However, for most people, a new helper configuration, `accessControlAllowMethodsByRoute()` will be the single most useful function to set: it allows for **automatic matching** of available methods for a route and sets the CORS Header `Access-Control-Allow-Methods` automatically; so now when your `OPTIONS` request hits your wheels app, it will actually respond with the available methods which are allowed for that resource endpoint. This makes it much easier to diagnose why certain requests might not get through, and means javascript libraries such as axios can respond more appropriately to hitting the wrong URL with the wrong HTTP method. + +### **Improvements to mapper()** + +Redirects can now be put directly in the `mapper()` routing call, so you can quickly add a simple redirect for a route if you need. + +`mapFormat` can now be set as `false`, which bypasses the additional '.\[format\]' routes which were put in by default for each resource. So if you don't use them, you can now just turn them off, and make your routing table a lot cleaner. This can be set either globally on the `mapper()` call itself, or on a per resource basis when using `resources()` + +### **params.\_json if request is Array** + +Previously, if you `POST`ed or `PUT/PATCH`ed json to an endpoint with an array as it's root element, it would just get ignored, and you'd not be able to access it in the `params` struct. This has now been changed and if the incoming payload is a json array, it will be available at `params._json` which matches rails conventions. + +### **New FlashAppend Behaviour** + +You can now change the default flash behaviour to append to an existing key, rather than directly replacing it. To turn on this behaviour, add `set(flashAppend=true)` to your `/config/settings.cfm` file. This allows you to more easily collect flash notifications during a request:` flashInsert(success="One"); flashInsert(success="Two");` + +### Plugin performance + +The plugins system has been reverted back to 1.x behaviour, as it was simply non-performant; more on this in a future post. + +## Full Changelog: + +### Potentially breaking changes + +- The new CFWheels internal GUI is more isolated and runs in it's own component: previously this was extending the developers main `Controller.cfc` which caused multiple issues. The migrator, test runner and routing GUIs have therefore all been re-written. +- The plugins system behaviour no longer chains multiple functions of the same name as this was a major performance hit. It's recommended that plugin authors check their plugins to run on 2.1 +- HTTP Verb/Method switching is now no longer allowed via GET requests and must be performed via POST (i.e via `_method`) + +### Model Enhancements + +- Migrator now automatically manages the timestamp columns on `addRecord()` and `updateRecord()` calls - [#852](https://github.com/cfwheels/cfwheels/pull/852) \[Charley Contreras\] +- Migrator correctly honors CFWheels Timestamp configuration settings (`setUpdatedAtOnCreate, softDeleteProperty, timeStampMode, timeStampOnCreateProperty, timeStampOnUpdateProperty`) - [#852](https://github.com/cfwheels/cfwheels/pull/852) \[Charley Contreras\] +- `MSSQL` now uses `NVARCHAR(max)` instead of `TEXT` [#896](https://github.com/cfwheels/cfwheels/pull/896) \[Reuben Brown\] +- Allow createdAt and updatedAt to be explicitly assigned using the `allowExplicitTimestamps=true` argument - [#887](https://github.com/cfwheels/cfwheels/issues/887) - \[Adam Chapman\] + +### Controller Enhancements + +- New `set(flashAppend=true)` option allows for appending of a Flash key instead of replacing - [#855](https://github.com/cfwheels/cfwheels/pull/855) - \[Tom King\] +- `flashMessages()` now checks for an array of strings or just a string and outputs appropriately - [#855](https://github.com/cfwheels/cfwheels/pull/855) - \[Tom King\] +- `flashInsert()` can now accept a one dimensional array - [#855](https://github.com/cfwheels/cfwheels/pull/855) - \[Tom King\] + +### Bug Fixes + +- Allow uppercase table names containing reserved substrings like `OR` and `AND` - [#765](https://github.com/cfwheels/cfwheels/issues/765) \[Dmitry Yakhnov, Adam Chapman\] +- Calculated properties can now override an existing property - [#764](https://github.com/cfwheels/cfwheels/issues/764) \[Adam Chapman, Andy Bellenie\] +- Filters are now correctly called if there is more than one after filter - [#853](https://github.com/cfwheels/cfwheels/issues/853) \[Brandon Shea, Tom King, Adam Chapman\] +- Minor fix for duplicate debug output in the test suite - [#176](https://github.com/cfwheels/cfwheels/issues/176) \[Adam Chapman, Tom King\] +- Convert `handle` to a valid variable name so it doesn't break when using dot notation - [#846](https://github.com/cfwheels/cfwheels/issues/846) \[Per Djurner\] +- The `validatesUniquenessOf()` check now handles cases when duplicates already exist - [#480](https://github.com/cfwheels/cfwheels/issues/480) \[Randall Meeker, Per Djurner\] +- `validatesConfirmationOf()` now has a `caseSensitive` argument to optionally perform a case sensitive comparison - [#918](https://github.com/cfwheels/cfwheels/issues/918) \[Tom King\] +- `sendFile()` no longer expands an already expanded directory on ACF2016 - [#873](https://github.com/cfwheels/cfwheels/issues/873) \[David Paul Belanger, Tom King, strubenstein\] +- Automatic database migrations onApplicationStart now correctly reference appropriate Application scope - [#870](https://github.com/cfwheels/cfwheels/issues/870) \[Tom King\] +- `usesLayout()` now can be called more than once and properly respects the order called - [#891](https://github.com/cfwheels/cfwheels/issues/891) \[David Paul Belanger\] +- Migrator MSSQL adapter now respects `Time` and `Timestamp` Column Types - [#906](https://github.com/cfwheels/cfwheels/issues/906) \[Reuben Brown\] +- Automatic migrations fail on application start - [#913](https://github.com/cfwheels/cfwheels/issues/913) \[Adam Chapman\] +- Default `cacheFileChecking` to `true` in development mode - \[Adam Chapman, Steve Harvey\] +- Migrator columnNames list values are now trimmed - [#919](https://github.com/cfwheels/cfwheels/issues/#919) \[Adam Chapman\] +- Fixes bug when httpRequestData content is a JSON array - [#926](https://github.com/cfwheels/cfwheels/issues/#926) \[Adam Chapman\] +- When httpRequestData content is a JSON array, contents are now automatically added to `params._json` - [#939](https://github.com/cfwheels/cfwheels/issues/#939) \[Tom King\] +- Fixes bug where Migrator $execute() always appends semi-colon - [#924](https://github.com/cfwheels/cfwheels/issues/#924) \[Adam Chapman\] +- Fixes bug where model createdAt property is changed upon update - [#927](https://github.com/cfwheels/cfwheels/issues/#927) \[Brandon Shea, Adam Chapman\] +- Fixed silent application.wheels scope exception hampering autoMigrateDatabase - [#957](https://github.com/cfwheels/cfwheels/issues/#957) \[Adam Chapman, Tom King\] + +### Miscellaneous + +- Added the ability to pass `&lock=false` in the URL for when reload requests won't work due to locking - \[Per Djurner\] +- Basic 302 redirects now available in mapper via `redirect` argument for `GET/PUT/PATCH/POST/DELETE` - [#847](https://github.com/cfwheels/cfwheels/issues/847) - \[Tom King\] +- `.[format]` based routes can now be turned off in `resources()` and `resource()` via `mapFormat=false` - [#899](https://github.com/cfwheels/cfwheels/issues/899) - \[Tom King\] +- `mapFormat` can now be set as a default in `mapper()` for all child `resources()` and `resource()` calls - [#899](https://github.com/cfwheels/cfwheels/issues/899) - \[Tom King\] +- `HEAD` requests are now aliased to `GET` requests [#860](https://github.com/cfwheels/cfwheels/issues/860) - \[Tom King\] +- Added the `includeFilters` argument to the `processRequest` function for skipping execution of filters during controller unit tests - \[Adam Chapman\] +- Added the `useIndex` argument to finders for adding table index hints [#864](https://github.com/cfwheels/cfwheels/issues/864) - \[Adam Chapman\] +- HTTP Verb/Method switching is now no longer allowed via `GET` requests and must be performed via `POST` [#886](https://github.com/cfwheels/cfwheels/issues/886) - \[Tom King\] +- CORS Header `Access-Control-Allow-Origin` can now be set either via a simple value or list in `accessControlAllowOrigin()` [#888](https://github.com/cfwheels/cfwheels/issues/888) \[Tom King\] +- CORS Header `Access-Control-Allow-Methods` can now be set via `accessControlAllowMethods(value)` [#888](https://github.com/cfwheels/cfwheels/issues/888) \[Tom King\] +- CORS Header `Access-Control-Allow-Credentials` can now be turned on via `accessControlAllowCredentials(true)`; [#888](https://github.com/cfwheels/cfwheels/issues/888) \[Tom King\] +- `accessControlAllowMethodsByRoute()` now allows for automatic matching of available methods for a route and sets CORS Header `Access-Control-Allow-Methods` appropriately [#888](https://github.com/cfwheels/cfwheels/issues/888) \[Tom King\] +- CORS Header can now be set via `accessControlAllowHeaders(value)` [#888](https://github.com/cfwheels/cfwheels/issues/888) \[Tom King\] +- Performance Improvement: Scanning of Models and Controllers [#917](https://github.com/cfwheels/cfwheels/issues/917) \[Adam Chapman\] +- Added the `authenticityToken()` function for returning the raw CSRF authenticity token [#925](https://github.com/cfwheels/cfwheels/issues/925) \[Adam Chapman\] +- Adds `enablePublicComponent`, `enableMigratorComponent`,`enablePluginsComponent` environment settings to completely disable those features [#926](https://github.com/cfwheels/cfwheels/issues/936) \[Tom King\] +- New CFWheels Internal GUI [#931](https://github.com/cfwheels/cfwheels/issues/931) \[Tom King\] +- `pluginRunner()` now removed in favour of 1.x plugin behaviour for performance purposes [#916](https://github.com/cfwheels/cfwheels/issues/916) \[Core Team\] +- Adds `validateTestPackageMetaData` environment setting for skipping test package validation on large test suites [#950](https://github.com/cfwheels/cfwheels/issues/950) \[Adam Chapman\] +- Added aliases for `migrator.TableDefinition` functions to allow singular variant of the `columnNames` property [#922](https://github.com/cfwheels/cfwheels/issues/922) \[Sébastien FOCK CHOW THO\] +- `onAbort` is now supported via `events/onabort.cfm` [#962](https://github.com/cfwheels/cfwheels/issues/962) \[Brian Ramsey\] + +![](https://cfwheels.org/blog/wp-content/uploads/2020/02/3q4mic.jpg) diff --git a/web/content/blog/posts/cfwheels-2-1-released.md b/web/content/blog/posts/cfwheels-2-1-released.md new file mode 100644 index 0000000000..dc3c0b9d28 --- /dev/null +++ b/web/content/blog/posts/cfwheels-2-1-released.md @@ -0,0 +1,30 @@ +--- +title: CFWheels 2.1 Released +slug: cfwheels-2-1-released +publishedAt: '2020-04-12T12:55:52.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 2-1 +categories: + - Releases +excerpt: >- + Today sees the release of CFWheels 2.1. Only a couple of bug fixes since the + beta, so please refer to the + changelog(https://github.com/cfwheels/cfwheels/blob/master/CHANGELOG.md) for a + list of all ... +coverImage: null +legacyId: '106' +--- + +Today sees the release of CFWheels 2.1. Only a couple of bug fixes since the beta, so please refer to the [changelog](https://github.com/cfwheels/cfwheels/blob/master/CHANGELOG.md) for a list of all changes. + +[Download now](https://github.com/cfwheels/cfwheels/releases/download/v2.1.0/cfwheels-2.1.0.zip) (zip) + +If updating from CFWheels 2.0.x: + +- replace your `wheels` folder from the one in the download, and +- outside the `wheels` folder, ensure you've got a file at `events/onabort.cfm` and create it if needed. +- rename any instances of `findLast`() to `findLastOne()` (this has been changed due to Lucee 5.3 having a new inbuilt function called findLast() which clashes with the wheels internals) + +Happy Easter, and stay safe! diff --git a/web/content/blog/posts/cfwheels-2-2-released.md b/web/content/blog/posts/cfwheels-2-2-released.md new file mode 100644 index 0000000000..6a78c40fb8 --- /dev/null +++ b/web/content/blog/posts/cfwheels-2-2-released.md @@ -0,0 +1,33 @@ +--- +title: CFWheels 2.2 Released +slug: cfwheels-2-2-released +publishedAt: '2020-11-22T13:11:31.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: [] +categories: + - Releases +excerpt: >- + It's been a while coming. Can I blame the pandemic? Lots of nice little tweaks + and fixes in this version. Please see the + changelog(https://github.com/cfwheels/cfwheels/blob/v2.2.0/CHANGELOG.md) + for... +coverImage: null +legacyId: '107' +--- + +It's been a while coming. Can I blame the pandemic? Lots of nice little tweaks and fixes in this version. Please see the [changelog](https://github.com/cfwheels/cfwheels/blob/v2.2.0/CHANGELOG.md) for all details. + +[Download zip](https://github.com/cfwheels/cfwheels/releases/download/v2.2.0/cfwheels-2.2.0.zip) + +**If updating from CFWheels 2.1.x:** + +It should be an easy upgrade , just swap out the `wheels` folder. + +**If updating from CFWheels 2.0.x:** + +- replace your `wheels` folder from the one in the download, and +- outside the `wheels` folder, ensure you've got a file at `events/onabort.cfm` and create it if needed. +- rename any instances of `findLast`() to `findLastOne()` (this has been changed due to Lucee 5.3 having a new inbuilt function called findLast() which clashes with the wheels internals) + +As always, a huge thanks to all contributors - stay safe out there! diff --git a/web/content/blog/posts/cfwheels-2-3-0-rc-1.md b/web/content/blog/posts/cfwheels-2-3-0-rc-1.md new file mode 100644 index 0000000000..e55d9f1f10 --- /dev/null +++ b/web/content/blog/posts/cfwheels-2-3-0-rc-1.md @@ -0,0 +1,60 @@ +--- +title: CFWheels 2.3.0-rc.1 Released +slug: cfwheels-2-3-0-rc-1 +publishedAt: '2022-05-03T16:28:19.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: + - 2-3-0-rc-1 +categories: + - Releases +excerpt: >- + This version has been cooking for a while and there have been many + contributors. But since this is my first release a the helm with a new CI + pipeline in place, I felt more comfortable doing a Relea... +coverImage: null +legacyId: '114' +--- + +This version has been cooking for a while and there have been many contributors. But since this is my first release a the helm with a new CI pipeline in place, I felt more comfortable doing a Release Candidate first. + +[Download Zip](https://github.com/cfwheels/cfwheels/releases/download/v2.3.0-rc.1/cfwheels-variants.zip) + +### If updating from CFWheels 2.2.x: + +If should be an easy upgrade, just swap out the `wheels` folder. + +## Changelog + +### View Enhancements + +- Adds association error support via `includeAssociations` argument [#1080](https://github.com/cfwheels/cfwheels/issues/1080) - \[Nikolaj Frey\] + +### Bug Fixes + +- onerror handler should increase user defined requestTimeout value [#1056](https://github.com/cfwheels/cfwheels/issues/1056) - \[Adam Chapman\] +- deletedAt should also respect timestamp mode (UTC) [#1063](https://github.com/cfwheels/cfwheels/issues/1063) - \[David Belanger\] +- Fixes No output from `Debug()` usage in plugin test cases [#1061](https://github.com/cfwheels/cfwheels/issues/1063) - \[Tom King\] +- Development mode will now properly return a 404 status if view not found [#1067](https://github.com/cfwheels/cfwheels/issues/1067) - \[Adam Cameron, Tom King\] +- 404 status now properly returned without URL rewriting [#1067](https://github.com/cfwheels/cfwheels/issues/1067) - \[Adam Cameron, Tom King\] +- Internal Docs in ACF2018 should now not display duplicate categories \[Tom King\] +- Internal Docs search now resets itself properly on backspace with empty value [#982](https://github.com/cfwheels/cfwheels/issues/982) - \[Brandon Shea, Tom King\] +- `ValidatesConfirmationOf()` now correctly enforces prescence of confirmation property [#1070](https://github.com/cfwheels/cfwheels/issues/1070) - \[Adam Cameron, Tom King\] +- `resource()`/`resources()` now allows empty `only` property to utilise as non-route parent [#1083](https://github.com/cfwheels/cfwheels/issues/1083) - \[Brian Ramsey\] +- Handle XSS Injection in development enviroment - \[Michael Diederich\] +- Fix params bug in CLI API \[[#1106](https://github.com/cfwheels/cfwheels/pull/1106)\] - \[Peter Amiri\] + +### Miscellaneous + +- Update Docker Lucee Commandbox version to 5.2.0 - \[Adam Chapman, Tom King\] +- Minor internal obselete reference to modelComponentPath removed - \[Adam Chapman, Tom King\] +- Minor visual fix for long migration logs overflow in modal (scroll) - \[Brian Ramsey\] +- Add test suite for Lucee and H2 Database to the GitHub Actions test suite. - \[Peter Amiri\] +- On going changes to update the H2 drivers \[[#1107](https://github.com/cfwheels/cfwheels/pull/1107)\] - \[Peter Amiri\] +- Fixes some syntax formating introduced by cfformat \[[#1111](https://github.com/cfwheels/cfwheels/pull/1111)\] - \[Adam Chapman\] +- Minimum ColdFusion version is now ColdFusion (2018 release) Update 3 (2018,0,03,314033) / ColdFusion (2016 release) Update 10 (2016,0,10,314028) / ColdFusion 11 Update 18 (11,0,18,314030) [#923](https://github.com/cfwheels/cfwheels/issues/923) - \[Michael Diederich\] +- Wheels save(allowExplicitTimestamps=true) doesn't produce the expected result \[[#1113](https://github.com/cfwheels/cfwheels/pull/1113)\] - \[SebastienFCT\] + +### Potentially Breaking Changes + +- Automatic Time Stamps: the **deletedAt** column was using the server's local time for the timestamp while **createdAt** / **updatedAt** were using the timestamp selected for the timestamp mode. The default for CFWheels' timestamp mode is UTC and therefore all future **deletedAt** timestamps will be in UTC unless you've changed the default. Please review any SQL that uses **deletedAt** for datetime comparison. diff --git a/web/content/blog/posts/cfwheels-2-3-0-released.md b/web/content/blog/posts/cfwheels-2-3-0-released.md new file mode 100644 index 0000000000..cb07e18982 --- /dev/null +++ b/web/content/blog/posts/cfwheels-2-3-0-released.md @@ -0,0 +1,29 @@ +--- +title: CFWheels 2.3.0 Released +slug: cfwheels-2-3-0-released +publishedAt: '2022-05-11T20:56:51.000Z' +updatedAt: '2025-06-02T13:13:58.000Z' +author: Peter Amiri +tags: + - v-2-3-0-rc-1 + - v2-3-0 +categories: [] +excerpt: >- + This is the official v2.3.0 release. It is dropping a little over a week from + Release Candidate 1. We simply wanted to make sure the new CI/CD workflow was + functioning before calling the release fi... +coverImage: null +legacyId: '116' +--- + +This is the official v2.3.0 release. It is dropping a little over a week from Release Candidate 1. We simply wanted to make sure the new CI/CD workflow was functioning before calling the release final. We feel confident that we're good to mark this release as final. There are no new enhancement or bug fixes in this release from 2.3.0.rc.1. + +[Download Zip](https://github.com/cfwheels/cfwheels/releases/download/v2.3.0/cfwheels-variants.zip) + +### If updating from CFWheels 2.2.x: + +If should be an easy upgrade, just swap out the `wheels` folder. + +## Changelog + +Please refer to release [2.3.0.rc.1](/blog/cfwheels-2-3-0-rc-1/) for details. diff --git a/web/content/blog/posts/cfwheels-added-to-the-htmx-server-side-examples-page.md b/web/content/blog/posts/cfwheels-added-to-the-htmx-server-side-examples-page.md new file mode 100644 index 0000000000..b705a73ce1 --- /dev/null +++ b/web/content/blog/posts/cfwheels-added-to-the-htmx-server-side-examples-page.md @@ -0,0 +1,28 @@ +--- +title: "CFWheels Added to the htmx Server-Side Examples\_Page" +slug: cfwheels-added-to-the-htmx-server-side-examples-page +publishedAt: '2022-06-17T15:28:09.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - Community +excerpt: >- + Back in March we published an example app where we took the TodoMVC + spec(https://github.com/tastejs/todomvc) and built a reference implementation + of the app with CFWheels and htmx(https://github.co... +coverImage: null +legacyId: '121' +--- + +Back in March we published an example app where we took the [TodoMVC spec](https://github.com/tastejs/todomvc) and built a reference implementation of the app with [CFWheels and htmx](https://github.com/bpamiri/cfwheels-todomvc-htmx). Here is a quick graphic of the UI of the app. + +[![](https://cfwheels.org/blog/wp-content/uploads/2022/03/cfwheels-todomvc-htmx.gif)](https://cfwheels.org/blog/wp-content/uploads/2022/03/cfwheels-todomvc-htmx.gif) + +Todo app implemented with CFWheels and htmx + +This app has now been added to the list of [Server-Side integration](https://htmx.org/server-examples/) examples on the htmx website. + +htmx at it's core is html over the wire. Instead of returning JSON from backend APIs and consuming them with Javascript to build page interactivity, htmx takes a different approach. It expects actual html snippets to be returned that are swapped into the DOM. How it does it, is by extending html with a handful of additional attributes, that probably should have been there in the first place, which enable any HTML element to issue an AJAX call to the backend, specify what triggers the call, and specify how the returned HTML should be added to the DOM. + +We'll be doing more with HTMX in the future so it's great to get CFWheels on the radars of the htmx project. diff --git a/web/content/blog/posts/cfwheels-announces-a-bug-bounty.md b/web/content/blog/posts/cfwheels-announces-a-bug-bounty.md new file mode 100644 index 0000000000..d6efbca1ed --- /dev/null +++ b/web/content/blog/posts/cfwheels-announces-a-bug-bounty.md @@ -0,0 +1,26 @@ +--- +title: CFWheels Announces a Bug Bounty +slug: cfwheels-announces-a-bug-bounty +publishedAt: '2022-05-17T02:36:12.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - Community + - Contributions + - Events +excerpt: >- + We are happy to launch a new program that we hope will lead to a more stable + framework for all of us. Effective immediately we are launching our Bug Bounty + program. When we first conceived of the b... +coverImage: null +legacyId: '117' +--- + +We are happy to launch a new program that we hope will lead to a more stable framework for all of us. Effective immediately we are launching our Bug Bounty program. When we first conceived of the bounty program we were looking at programs from [IssueHunt](https://issuehunt.io/issues) and [BountySource](https://bountysource.com/) and the main goal was to widen the field of contributors to the CFWheels project as well as crush some of the long standing bugs in the framework. + +Most of these bugs are edge cases that don’t effect the core functionality of the framework and for the most part users have found work arounds for. In the past it’s been difficult to dedicate our limited resources towards some of these bugs but now that we have a growing list of monthly sponsors we would like to launch out bounty program to compensate contributors who are willing to tackle some of these. + +The easiest way to get started participating in this program is to visit the [issues list](https://github.com/cfwheels/cfwheels/issues) and look for the [$50 Bounty](https://github.com/cfwheels/cfwheels/issues?q=is%3Aissue+is%3Aopen+label%3A%22%2450+Bounty%22) tag. Pick an issue that interests you, clone the repo, and start working on your solution. When you think you have a working solution create a PR and submit it for review. Please read the [Contributing to CFWheels](https://guides.cfwheels.org/cfwheels-guides/working-with-cfwheels/contributing-to-cfwheels) chapter in the guides or the [contributing guidelines](https://github.com/cfwheels/cfwheels/blob/develop/CONTRIBUTING.md) in the repository for details on how to contribute to the CFWheels project. + +We look forward to see how the community responds to this bounty program. Depending on how things go, we can envision expanding this program to include enhancements as well as sponsorship of individual enhancements. diff --git a/web/content/blog/posts/cfwheels-dotenvsettings-plugin-published.md b/web/content/blog/posts/cfwheels-dotenvsettings-plugin-published.md new file mode 100644 index 0000000000..06bdc5d9bd --- /dev/null +++ b/web/content/blog/posts/cfwheels-dotenvsettings-plugin-published.md @@ -0,0 +1,60 @@ +--- +title: CFWheels DotEnvSettings Plugin published +slug: cfwheels-dotenvsettings-plugin-published +publishedAt: '2022-06-06T23:34:19.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - CLI + - Contributions + - Plugin +excerpt: >- + A new plugin was published to provide support for .env settings files in a + production environment. This plugin is based on Eric Peterson's CommandBox + module and allows the use of .env or similarly ... +coverImage: null +legacyId: '119' +--- + +A new plugin was published to provide support for .env settings files in a production environment. This plugin is based on Eric Peterson's CommandBox module and allows the use of .env or similarly named files to store your application secrets so they can be kept out of source control. + +## LICENSE + +Apache License, Version 2.0. + +## SYSTEM REQUIREMENTS + +- Lucee 5+ +- ColdFusion 9+ +- CFWheels 2+ + +# Instructions + +Just drop the zip file into your `plugins` folder and restart your application or use CommandBox cli to install. Simply type the following at the root of your project: + +``` +box install cfwheels-dotenvsettings +``` + +## Usage + +Create a .env file in your project root and add to .gitignore or your version control's equivalent (don't commit secrets to your repo!) The file can contain JSON or Java properties style key value pairs: + +``` +// property style +MY_SECRET_KEY=somevalue +MY_OTHER_SECRET=shh + +// json style +{ + "MY_SECRET_KEY"="somevalue" + ,"MY_OTHER_SECRET"="shh" +}; +``` + +The default file name supported is .env but you can use any file name you want. You could even have multiple files for various environment. + +In your CFWheels app you can read in your secrets by adding `readDotEnvSettings()` to your application. The most logical point to do this would be in your `events\onApplicationStart.cfm` file, but you could do it in your environment specific `settings.cfm` files as well. You can then access the secrets contained in the file processed using `get("MY_SECRET_KEY")`. + +If you want to customize the secrets file to use, you can specify the file name by passing in the file name like so `readDotEnvSettings(".env-second")`. diff --git a/web/content/blog/posts/cfwheels-fully-embraces-forgebox-packages.md b/web/content/blog/posts/cfwheels-fully-embraces-forgebox-packages.md new file mode 100644 index 0000000000..7f330dd0ab --- /dev/null +++ b/web/content/blog/posts/cfwheels-fully-embraces-forgebox-packages.md @@ -0,0 +1,54 @@ +--- +title: CFWheels Fully Embraces ForgeBox Packages +slug: cfwheels-fully-embraces-forgebox-packages +publishedAt: '2022-04-30T00:13:48.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - CLI + - Community + - Documentation + - Releases + - Tips & Tricks +excerpt: >- + As you may know, many years ago CFWheels embraced the distribution of Plugins + via ForgeBox packages instead of maintaining our own directory. But the + framework itself remains illusive. There was so... +coverImage: null +legacyId: '113' +--- + +As you may know, many years ago CFWheels embraced the distribution of Plugins via ForgeBox packages instead of maintaining our own directory. But the framework itself remains illusive. There was some work done in the last few months to put up packages for the framework but those packages were being maintained by hand which made them a show stopper for a long term solution. + +Well, thanks to a new CI workflow based on GitHub Actions we now have the building and publishing of the packages fully automated. Giving credit where credit is due, the new workflow borrows heavily from the ColdBox workflow. It used GitHub Actions, Ant, and CommandBox to automate the process. + +So what does all this mean for you, let's cut to the chase. This means you can now install a fresh copy of the framework using the following command: + +``` +box install cfwheels-base-template +``` + +This will pull down a copy of the latest stable release of the template files and then pull down a copy of the latest stable release of the framework via package dependencies. In fact the CI workflow mentioned about publishes two packages `cfwheels` which is the core framework directory and `cfwheels-base-template` which is all the other files you need to scaffold the framework. + +We've even backfilled all the prior released versions of the framework all the way back to version 1.0.0. So you can install a particular version of the framework using the following command: + +``` +box install cfwheels-base-template@2.0.2 +``` + +In addition you can install the bleeding edge which includes all the work in process towards the next major release using: + +``` +box install cfwheels-base-template@be +``` + +And if you ever just need to get a copy of the latest framework files simply use the following command: + +``` +box install cfwheels +``` + +All this means that upgrading to a newer version of the framework should be much easier going forward. Frankly you should just need to modify the version of the dependency in the box.json file and issue a `box update` command. But we'll document that more fully when we make our next release. + +For now please feel free to play with all this package goodness and let us know if we fumbled anything. diff --git a/web/content/blog/posts/cfwheels-guides-moved-to-gitbook.md b/web/content/blog/posts/cfwheels-guides-moved-to-gitbook.md new file mode 100644 index 0000000000..c2046e83cf --- /dev/null +++ b/web/content/blog/posts/cfwheels-guides-moved-to-gitbook.md @@ -0,0 +1,26 @@ +--- +title: CFWheels Guides Moved to GitBook +slug: cfwheels-guides-moved-to-gitbook +publishedAt: '2022-05-10T16:46:21.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - Community + - Documentation + - Website +excerpt: >- + We are glad to announce that the CFWheels + Guides(https://guides.cfwheels.org/cfwheels-guides/introduction/getting-started) + have been moved to GitBook.com(https://www.gitbook.com). The good folks at... +coverImage: null +legacyId: '115' +--- + +We are glad to announce that the [CFWheels Guides](https://guides.cfwheels.org/cfwheels-guides/introduction/getting-started) have been moved to [GitBook.com](https://www.gitbook.com). The good folks at GitBook are proud to support CFWheels and have granted us an Open Source Community account. We have migrated all the guides from our old provider to GitBook and will be making some more changes as we review all the links now that the domain has been switched. A few things you'll notice right off the bat. + +There is now a PDF download link to the right of the screen when viewing the guides. The link allows you to download the section you are on or the entire CFWheels Guides. Which by the way, is nearly 300 pages long. There is also a new search feature that will allow you to find topics easier. But the biggest change comes from the fact that by moving to GitBook we were able to move the guides to GitHub as well. + +In fact the guides have been added as a sub directory in the [cfwheels/cfweels GitHub repository](https://github.com/cfwheels/cfwheels). By moving the guides within the codebase, you can finally include both code changes and documentation changes in the same PR. This will make the guides more accessible to our contributors and make it easier to keep the codebase and guides in sync. + +Please have a look through the new guides and let us know what you think. Oh, and if you find something that needs to be updated, you know the drill, clone, edit, and submit a PR. diff --git a/web/content/blog/posts/cfwheels-has-moved-to-github-discussions.md b/web/content/blog/posts/cfwheels-has-moved-to-github-discussions.md new file mode 100644 index 0000000000..18af1c3a0b --- /dev/null +++ b/web/content/blog/posts/cfwheels-has-moved-to-github-discussions.md @@ -0,0 +1,28 @@ +--- +title: CFWheels has moved to GitHub Discussions +slug: cfwheels-has-moved-to-github-discussions +publishedAt: '2022-05-27T16:13:02.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - Community + - Website +excerpt: >- + Although Google Groups has served us well over the years, it’s started to lose + some essential abilities and it’s looking a little long in the tooth. +coverImage: null +legacyId: '118' +--- + +Although Google Groups has served us well over the years, it’s started to lose some essential abilities and it’s looking a little long in the tooth. + +We have decided that it would be a benefit to the community to migrate to [GitHub Discussions](https://github.com/cfwheels/cfwheels/discussions). GitHub Discussions allows us to bring our community closer to where the code lives. + +> "People around the world are turning to open source—and to GitHub. It is becoming not only the home for developers, but a platform where people in many roles, doing diverse work, come to learn, engage with the community, and contribute to projects that advance the greater good." +> +> GitHub Octoverse 2020 Report + +The benefits of moving to Github Discussions are numerous, but at a glance, we look forward to having better syntax highlighting, marking comments as answers, flagging threads as Answered, easily turning a discussion into an issue, and many more. + +The Google Group will remain available, but we have disabled posting to the group, and we'll treat it as a read-only archive of past discussions. diff --git a/web/content/blog/posts/cfwheels-htmx-plugin-published.md b/web/content/blog/posts/cfwheels-htmx-plugin-published.md new file mode 100644 index 0000000000..15d2390529 --- /dev/null +++ b/web/content/blog/posts/cfwheels-htmx-plugin-published.md @@ -0,0 +1,159 @@ +--- +title: CFWheels HTMX Plugin published +slug: cfwheels-htmx-plugin-published +publishedAt: '2022-06-21T04:55:03.000Z' +updatedAt: '2025-06-02T13:08:53.000Z' +author: Peter Amiri +tags: [] +categories: [] +excerpt: >- + A few weeks ago I published a Todo + app(/blog/todomvc-implementation-with-cfwheels-and-htmx/) using CFWheels on + the backend and HTMX to provide the interactivity on the front end to make the + app loo... +coverImage: null +legacyId: '123' +--- + +A few weeks ago I published a [Todo app](/blog/todomvc-implementation-with-cfwheels-and-htmx/) using CFWheels on the backend and HTMX to provide the interactivity on the front end to make the app look and feel like a full blown SPA app. As I was developing that app I ran into a few things that I wish we had to make development with HTMX a little easier. But I'm getting ahead of myself. + +### What is HTMX + +Well, HTMX was released a couple of years ago and in that short time has just about exploded in the django community. So what is HTMX, HTMX tries to answer the following questions: + +1. Why should only `[](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a)` and `[
](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form)` be able to make HTTP requests? +2. Why should only `[click](https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event)` & `[submit](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit_event)` events trigger them? +3. Why should only `[GET](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET)` & `[POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)` methods be [available](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)? +4. Why should you only be able to replace the **entire** screen? + +By removing these arbitrary constraints, htmx completes HTML as a [hypertext](https://en.wikipedia.org/wiki/Hypertext) medium. You may even start wondering why these features weren't in HTML in the first place. So let's look at an examples. + +PlainBashC++C#CSSDiffHTML/XMLJavaJavaScriptMarkdownPHPPythonRubySQL + + + + + + + +This block of code tells the browser: + +> When a user clicks on this button, issue an AJAX request to /clicked, and replace the entire button with the HTML response. + +Let's look at a typical anchor tag: + +PlainBashC++C#CSSDiffHTML/XMLJavaJavaScriptMarkdownPHPPythonRubySQL + +Blog + +This anchor tag tells the browser: + +> When a user clicks on this link, issue an HTTP GET request to '/blog' and load the response content into the browser window. + +You can see how HTMX feels like a familiar extension to HTML. With this in mind lets look at a following block of HTML: + +PlainBashC++C#CSSDiffHTML/XMLJavaJavaScriptMarkdownPHPPythonRubySQL + + + +This tells HTMX: + +> When a user clicks on this button, issue an HTTP POST request to '/clicked' and use the content from the response to replace the element with the id `parent-div` in the DOM + +So by using `hx-get`, `hx-post`, `hx-put`, `hx-patch`, or `hx-delete` we gain access to all the HTTP verbs. Imagine a delete button on a table row that actually issues a HTTP Delete to your backend. + +The `hx-trigger` attribute gives us access to all the page events. HTML elements have sensible defaults, the `button` tag will get triggered by a click by default and an `input` tag will get triggered by a change event by default. But there are some special events as well, like the `load` event that will trigger the action when the page is initially loaded or the `revealed` event that will trigger the action, when the element scrolls into view. Think of an infinite scroll UX pattern where an element scrolls into view, which triggers a call to the backend to load more data that gets added to the bottom of the page. + +The `hx-target` attribute lets you specify a different tag to target than the element that triggered the event. You have the typical CSS selectors but also some special syntax like `closest TR` to target the closest table row. + +The last attribute shown in the example above is the `hx-swap` which specifies how to swap the response into the element. By default, the response replaces the `innerHTML` of the target element but you can just as easily replace the entire target element by using `outerHTML`. There are a few more designators that allow you to finely control placing the response before or after the target element in its parent element or at the begging of or end of a target's child elements. + +This is just scratching the surface of what HTMX can do but you should be getting the picture. By sprinkling in a handful of HTML attributes into your markup you can gain interactivity that was the domain of full blown JavaScript frontend frameworks in the past. + +### Why should we care as CFWheels developers + +By default HTMX is backend agnostic. It just deals with HTML and doesn't care what backend technology you use to generate it. This could just as easily be used in a plain vanilla CFML app or your framework of choice, hopefully it would be CFWheels since you are here reading this. Wheels has some built in features that make working with HTMX a breeze. We already have a templating system, we already have a router and controllers to intercept the HTTP request. We have a number of rendering methods that make responding to requests simple. + +If the request is a for a full page, use the `renderView()` method or simply let the controller hand the request off to the view which in turn renders the view page. If the request is for a portion of the final page then use the `renderPartial()` method and return a snippet of code tucked away in a partial. The same partial could be used by your initial view page, keeping your code DRY. Sometimes, you just want to return a small bit of text or no text at all and it doesn't make sense to build out a view or partial for every instance of these scenarios, that's when the `renderText()` method comes in handy. Imagine a typical index page from a CRUD application that lists a bunch of rows of data and some action buttons on each row. Let's assume, one of these buttons is a delete button. Look at the following code: + +PlainBashC++C#CSSDiffHTML/XMLJavaJavaScriptMarkdownPHPPythonRubySQL + +// image this button on a table row + + + +// imagine this code in your action + +function delete() { + +aProduct = model("product").findByKey(params.key); + +aProduct.delete(); + +renderText(""); + +} + +So what does the above combination do: + +> When the user clicks on the Delete button, prompt the user to make sure they are sure they wish to delete the record, if the user affirms the request, issue a DELETE request to the server. The server in turn deletes the record and sends back an empty text response to the client. When the response comes back to the frontend, find the closes table row, and remove it from the table. + +We just made an Ajax call to the server, removed the record from the database, and correspondingly updated the UI by just removing a single element from the DOM. + +### What does this plugin do? + +By default, HTMX adds some request headers to the call sent to the backend which can be interrogated to see if the request is in fact an HTMX request. If the request is actually an HTMX request, some additional request headers are made available which can add more color to the call being processed. This plugin automatically adds these header elements to the `params` structure which makes them automatically available to your controller actions. This makes it easier to work with this data and incorporate it into your request processing logic. Take a look at the following example: + +PlainBashC++C#CSSDiffHTML/XMLJavaJavaScriptMarkdownPHPPythonRubySQL + +function index() { + +if (params.htmx.reqeust) { + +renderPartial(partial="myPartial", layout="false"); + +} + +} + +This code block says: + +> When a request comes in to the index action of the controller, check to see if this is an HTMX request and if it is, respond with the `mypartial` partial and don't wrap it with the layout. Otherwise respond with the `index` view page of the current controller. + +Think of a paginated index page, where the first call to the index action sends the view with the first page of data and a button or element on the page triggers additional calls to the same action but this time only the next page of data is sent to the front end. + +### Installing the Plugin + +To install this plugin, issue the following command from the root of your application in a CommandBox prompt: + +PlainBashC++C#CSSDiffHTML/XMLJavaJavaScriptMarkdownPHPPythonRubySQL + +install cfwheels-htmx-plugin + +Once installed, reload your application and you're off to the races. diff --git a/web/content/blog/posts/cfwheels-joins-open-source-collective.md b/web/content/blog/posts/cfwheels-joins-open-source-collective.md new file mode 100644 index 0000000000..43a4f8e630 --- /dev/null +++ b/web/content/blog/posts/cfwheels-joins-open-source-collective.md @@ -0,0 +1,24 @@ +--- +title: CFWheels Joins Open Source Collective +slug: cfwheels-joins-open-source-collective +publishedAt: '2022-04-26T04:17:37.000Z' +updatedAt: '2025-06-02T13:16:55.000Z' +author: Peter Amiri +tags: + - donate + - funding + - open-source-collective +categories: [] +excerpt: >- + We are happy to announce that CFWheels has joined Open Source + Collective(https://opencollective.com/wheels-dev). According to their website, + Open Collective enables all kinds of groups to raise, ma... +coverImage: null +legacyId: '112' +--- + +We are happy to announce that CFWheels has joined [Open Source Collective](https://opencollective.com/wheels-dev). According to their website, Open Collective enables all kinds of groups to raise, manage, and spend money transparently. We’re also in good company in the collective. Other projects hosted by the Open Source Collective include Lucee, WebPack, PHP Foundation, Vue, LinuxServer, ESLint, Bower, Svelte, and the list literally goes on and on. + +So what does this mean for CFWheels. Well, it allows us to finally be able to accept donations from our community. Many of you have offered your donations to us in the past but we really had no good way to do accept them legally. Plus we felt strongly that as an open source project we needed to adopt an open and transparent accounting practices. As a member of the collective, you’ll be able to donate and see every dollar we raise and what it is spent on. Creating a sustainable ecosystem is important for the long term viability of the CFWheels project. So how do you donate, visit [Open Source Collective](https://opencollective.com/wheels-dev) directly or any of our [GitHub projects](https://github.com/cfwheels/cfwheels) and look for the **Sponsor this project** link in the right side bar. + +We’ve already received our first monthly donation and we are truly grateful. These funds will allow us to offer bounties for small issues or bugs, commission larger works, and pay for marketing, logo, or branding services. diff --git a/web/content/blog/posts/cfwheels-on-cf-alive-the-sequel.md b/web/content/blog/posts/cfwheels-on-cf-alive-the-sequel.md new file mode 100644 index 0000000000..376405389c --- /dev/null +++ b/web/content/blog/posts/cfwheels-on-cf-alive-the-sequel.md @@ -0,0 +1,22 @@ +--- +title: CFWheels on CF Alive the Sequel +slug: cfwheels-on-cf-alive-the-sequel +publishedAt: '2022-10-03T18:00:28.000Z' +updatedAt: '2025-06-02T12:59:28.000Z' +author: Peter Amiri +tags: + - screencasts +categories: [] +excerpt: >- + Back in February of 2019(/blog/cfwheels-on-cf-alive/) David Belanger and Tom + King from the CFWheels core team sat down with Michaela Light on the + ColdFusion Alive Podcast to have a chat about CFWhe... +coverImage: null +legacyId: '126' +--- + +[Back in February of 2019](/blog/cfwheels-on-cf-alive/) David Belanger and Tom King from the CFWheels core team sat down with Michaela Light on the ColdFusion Alive Podcast to have a chat about CFWheels. [A few weeks ago](https://teratech.com/podcast/cfwheels-coldfusion-framework-new-structure-and-features-with-peter-amiri/) Peter Amiri had a chance to speak to Michaela Light about recent developments in the CFWheels community, how to contribute to the project, and the road map ahead. + +Episode 122 of the ColdFusion Alive Podcast + +You can view the episode notes on the [TeraTech website](https://teratech.com/podcast/cfwheels-coldfusion-framework-new-structure-and-features-with-peter-amiri/). diff --git a/web/content/blog/posts/cfwheels-on-cf-alive.md b/web/content/blog/posts/cfwheels-on-cf-alive.md new file mode 100644 index 0000000000..279b1f503b --- /dev/null +++ b/web/content/blog/posts/cfwheels-on-cf-alive.md @@ -0,0 +1,24 @@ +--- +title: CFWheels on CF Alive +slug: cfwheels-on-cf-alive +publishedAt: '2019-02-25T17:01:23.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 2-0 + - 2-1 + - screencasts +categories: + - Community +excerpt: >- + David Belanger and Tom King from the CFWheels core team chat to host Michaela + Light on the CF Alive Podcast! Have a watch/listen and share far and wide... +coverImage: null +legacyId: '102' +--- + +David Belanger and Tom King from the CFWheels core team chat to host Michaela Light on the CF Alive Podcast! Have a watch/listen and share far and wide... + +https://youtu.be/9Bj0uFU4GKg + +You can view the original post on the TeraTech website [here](https://teratech.com/podcast/cfwheels-coldfusion-framework-rest-with-tom-king-and-david-belanger/) diff --git a/web/content/blog/posts/cfwheels-v2-4-0-released.md b/web/content/blog/posts/cfwheels-v2-4-0-released.md new file mode 100644 index 0000000000..388c540bb8 --- /dev/null +++ b/web/content/blog/posts/cfwheels-v2-4-0-released.md @@ -0,0 +1,57 @@ +--- +title: CFWheels v2.4.0 Released +slug: cfwheels-v2-4-0-released +publishedAt: '2022-08-23T15:35:37.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - Community +excerpt: >- + This version is the accumulation of bug fixes and minor enhancements over the + last quarter. This release welcomes John Bampton and Coleman Sperando, two + first time contributors to the project. +coverImage: null +legacyId: '124' +--- + +This version is the accumulation of bug fixes and minor enhancements over the last quarter. This release welcomes John Bampton and Coleman Sperando, two first time contributors to the project. + +[Download Zip](https://github.com/cfwheels/cfwheels/releases/download/v2.4.0%2B1/cfwheels-2.4.0.zip) + +### If updating from CFWheels 2.3.x: + +It should be an easy upgrade, just swap out the `wheels` folder. + +### If you installed CFWheels with CommandBox and have a box.sjon file: + +Enter `install cfwheels` in the root of your site to update your `wheels` folder to the latest. + +## Changelog + +### Bug Fixes + +- issue-1091-wheels-paths-in-error-template [#1091](https://github.com/cfwheels/cfwheels/issues/1091) - \[Adam Chapman\] +- issue-1082-validations should not trim properties [#1082](https://github.com/cfwheels/cfwheels/issues/1082) - \[Adam Chapman\] +- issue-1088-Adds SQL parsing regex tweak which correctly handles whitespace [#1088](https://github.com/cfwheels/cfwheels/issues/1088) - \[Adam Chapman, Adam Cameron\] + +### Miscellaneous + +- Adds cfformat ignore marker comments around core "view" cfm files that contain html markup - \[Adam Chapman\] +- Adds the ability to scroll large items horizontally in the test runner UI [#1130](https://github.com/cfwheels/cfwheels/pull/1130) - \[Adam Chapman\] +- Fix cfformat ignore markers [#1129](https://github.com/cfwheels/cfwheels/pull/1129) - \[Adam Chapman\] +- Enable finder model methods to returnAs "sql", mainly for debugging [#1141](https://github.com/cfwheels/cfwheels/pull/1141) - \[Adam Chapman\] +- Show the Test Runner buttons in the CFWheels GUI on the Package List screen allowing the developer to run the entire test suite instead of one package at a time. - \[Peter Amiri\] +- The Base Template now contains all necessary placeholders for the CLI to interact with the application and be able to inject code properly. - \[Peter Amiri\] +- By default the Core tests will run in the application datasource, but the developer can setup a different database for running the Core tests to ensure there is no side effects from running the tests. If you do end up setting a different database for the coreTestDatasourceName, make sure to reload your application after running the Core tests. - \[Peter Amiri\] +- Fix two broken links in README. \[[#1150](https://github.com/cfwheels/cfwheels/pull/1150)\] - \[John Bampton - \* *New Contributor* \*\] +- Fix spelling \[[#1151](https://github.com/cfwheels/cfwheels/pull/1151)\]\[[#1158](https://github.com/cfwheels/cfwheels/pull/1158)\] - \[John Bampton - \* *New Contributor* \*\] +- Add .env parser to parse .env files and add the properties found in the file to this.env scope. [#1157](https://github.com/cfwheels/cfwheels/pull/1157) - \[Peter Amiri\] +- Update the local test suite to supported ARM architecture docker images to make the suite compatible with the Apple Silicon Macs. [#1143](https://github.com/cfwheels/cfwheels/pull/1143) - \[Peter Amiri\] + +### Guides + +- Fix broken links throughout the guides. - \[Peter Amiri\] +- Fixed mailto link in CONTRIBUTING.md [#1123](https://github.com/cfwheels/cfwheels/pull/1123) - \[Coleman Sperando \* *New Contributor* \*\] +- Fix test guides examples [#1125](https://github.com/cfwheels/cfwheels/pull/1125) \[Adam Chapman\] +- Fix typos in the guides [#1161](https://github.com/cfwheels/cfwheels/pull/1161) \[Adam Chapman\] diff --git a/web/content/blog/posts/cfwheels-v2-5-0-released.md b/web/content/blog/posts/cfwheels-v2-5-0-released.md new file mode 100644 index 0000000000..0596d718e2 --- /dev/null +++ b/web/content/blog/posts/cfwheels-v2-5-0-released.md @@ -0,0 +1,83 @@ +--- +title: CFWheels v2.5.0 Released +slug: cfwheels-v2-5-0-released +publishedAt: '2023-11-05T00:51:22.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: + - 2-5 +categories: + - Community +excerpt: >- + This is a major milestone release of CFWheels v2.5.0 that has been in the + works for over a year. As you can see nearly 34 PRs have been merged into the + codebase which include many enhancements and ... +coverImage: null +legacyId: '127' +--- + +This is a major milestone release of CFWheels v2.5.0 that has been in the works for over a year. As you can see nearly 34 PRs have been merged into the codebase which include many enhancements and bug fixes. In addition many changes have been made to the tooling used in the project. + +Here are some of the highlights: + +- We have begun to publish SNAPSHOTS to ForgeBox.io on each successful commit to the develop branch. +- The GitHub Actions CI scripts use the same configuration files as the local Docker testing suite. If you are inclined to contribute to the CFWheels project you will most likely want to be able to run the test suite locally in Docker containers to test your changes before you submit a PR. To run the local test suite simply type `docker compose up` in the root of your project. The source code is injected into the containers dynamically so it makes it easier to make changes and see them appear in the docker containers without rebuilding the containers. Look for more details on this to come in the future. +- Every commit is now tested across a matrix of 20 combinations of CF Engines and Databases. The matrix includes CF Engines (Lucee 5, Lucee 6, Adobe ColdFusion 2016, Adobe ColdFusion 2018, Adobe ColdFusion 2021, and Adobe ColdFusion 2023) and databases (H2, MS SQL Server, PostgreSQL, and MySQL). +- Each successful commit automatically builds two packages on ForgeBox. One for the default template and one for the core CFWheels folder. + +## Upgrading an Existing Project + +The changes in this version are confined to the `wheels` directory so simply swapping out your `wheels` directory should be all you need to do to upgrade. + +## Changelog + +### Model Enhancements + +- PR-1183-Allow datasource argument in finders [#1183](https://github.com/cfwheels/cfwheels/pull/1183) - \[Adam Chapman\] +- PR-1201-Issue [ORM create() fails object validation for not null columns with defaults #929](https://github.com/cfwheels/cfwheels/issues/929) validate not nullable columns with default [#1201](https://github.com/cfwheels/cfwheels/pull/1201) - \[Adam Chapman\] +- PR-1202-Remove old oracle test workaround [#1202](https://github.com/cfwheels/cfwheels/pull/1202) - \[Adam Chapman\] +- PR-1205-issue-1182-adds-simplelock-to-sql-caching [#1205](https://github.com/cfwheels/cfwheels/pull/1205) - \[Adam Chapman\] +- PR-1222-Findall() performance bottleneck [#1222](https://github.com/cfwheels/cfwheels/pull/1222) - \[Adam Chapman\] +- PR-1223-refactor-queryCallback-with-inbuilt-query-functions [#1223](https://github.com/cfwheels/cfwheels/pull/1223) - \[Adam Chapman\] +- PR-1226-Invalid column not throwing exception in select argument [#1226](https://github.com/cfwheels/cfwheels/pull/1226) - \[Zain Ul Abideen\] +- PR-1265-improve-performance-refactor-out-listfind [#1265](https://github.com/cfwheels/cfwheels/pull/1265) - \[Adam Chapman\] +- PR-1260-Adds support for native query returnType [#1260](https://github.com/cfwheels/cfwheels/pull/1260) - \[Adam Chapman\] +- PR-1249-Removed the original IF/ELSE condition that invalidates calculated props and added condition [#1240](https://github.com/cfwheels/cfwheels/pull/1249) - \[Zain Ul Abideen\] + +### View Enhancements + +- PR-1254-issue 908 enable paginationLinks() to set active class on parent [#1254](https://github.com/cfwheels/cfwheels/pull/1254) - \[Zain Ul Abideen\] + +### Bug Fixes + +- PR-1227-Return a numeric value if the primary key is Numeric [#1227](https://github.com/cfwheels/cfwheels/pull/1227) - \[Zain Ul Abideen\] +- PR-1257-Checkbox bug when checkedvalue is not true [#1257](https://github.com/cfwheels/cfwheels/pull/1257) - \[Adam Chapman\] +- PR-1246-set the default route if it is not passed in the function [#1246](https://github.com/cfwheels/cfwheels/pull/1246) - \[Zain Ul Abideen\] +- PR-1256-issue 889 unable to duplicate component [#1256](https://github.com/cfwheels/cfwheels/pull/1256) - \[Zain Ul Abideen\] +- PR-1253-Issue 580 select ambiguous column name using the wheels alias [#1253](https://github.com/cfwheels/cfwheels/pull/1253) - \[Zain Ul Abideen\] +- PR-1245-Added afterFind callback hook in the findAll function in case of structs [#1245](https://github.com/cfwheels/cfwheels/pull/1245) - \[Zain Ul Abideen\] +- PR-1302-Check for Reload Password when setting a url IP exception [#1302](https://github.com/cfwheels/cfwheels/pull/1302) - Peter Amiri + +### Miscellaneous + +- PR-1175-restoreTestRunnerApplicationScope setting [#1175](https://github.com/cfwheels/cfwheels/pull/1175) - \[Adam Chapman\] +- PR-1176-fix text in core readme file [#1176](https://github.com/cfwheels/cfwheels/pull/1176) - \[Per Djurner\] +- PR-1177-fix text in base template readme file [#1177](https://github.com/cfwheels/cfwheels/pull/1177) - \[Per Djurner\] +- PR-1178-fix text in default template file [#1178](https://github.com/cfwheels/cfwheels/pull/1178) - \[Per Djurner\] +- PR-1185-adds-root-docker-volume [#1185](https://github.com/cfwheels/cfwheels/pull/1185) - \[Adam Chapman\] +- PR-1200-Update the docker-compose command to docker compose v2 syntax [#1200](https://github.com/cfwheels/cfwheels/pull/1200/) - \[Adam Chapman, Peter Amiri\] +- PR-1204-Add Lucee 6 to test matrix on local Docker test suite [#1204](https://github.com/cfwheels/cfwheels/pull/1204/) - \[Peter Amiri\] +- PR-1203-ensure testing params maintained [#1203](https://github.com/cfwheels/cfwheels/pull/1203) - \[Adam Chapman\] +- PR-1228-Adding addClass attribute in the function textField [#1228](https://github.com/cfwheels/cfwheels/pull/1228) - \[Zain Ul Abideen\] +- PR-1230-Add Adobe 2021 Support to local Docker and GitHub Actions testing - [#1230](https://github.com/cfwheels/cfwheels/pull/1230) - Peter Amiri +- PR-1264-update Lucee 6 version used for tests to latest [#1264](https://github.com/cfwheels/cfwheels/pull/1264) - \[Zac Spitzer - \* *New Contributor* \*\] +- PR-1241-Fix spelling and remove whitespace from link [#1241](https://github.com/cfwheels/cfwheels/pull/1241) - \[John Bampton\] +- PR-1247-show the current git branch in the debug layout [#1247](https://github.com/cfwheels/cfwheels/pull/1247) - \[Michael Diederich\] +- PR-1250-Added test framework functions in the docs [#1250](https://github.com/cfwheels/cfwheels/pull/1250) - \[Zain Ul Abideen\] +- PR-1255-issue 1179 Downloaded the CDN files and changed paths in files [#1255](https://github.com/cfwheels/cfwheels/pull/1255) - \[Zain Ul Abideen\] + +### Guides + +- PR-1198-Documentation-fixes [#1198](https://github.com/cfwheels/cfwheels/pull/1198) - \[Adam Chapman\] + +[Download Zip File](https://github.com/cfwheels/cfwheels/archive/refs/tags/v2.5.0.zip) diff --git a/web/content/blog/posts/cfwheels-x-dresshead-short-sleeved-dress-contrasting-wrap-details-irregular-hemline.md b/web/content/blog/posts/cfwheels-x-dresshead-short-sleeved-dress-contrasting-wrap-details-irregular-hemline.md new file mode 100644 index 0000000000..89b9922d7b --- /dev/null +++ b/web/content/blog/posts/cfwheels-x-dresshead-short-sleeved-dress-contrasting-wrap-details-irregular-hemline.md @@ -0,0 +1,21 @@ +--- +title: >- + Cfwheels x DressHead Short Sleeved Dress - Contrasting Wrap Details / + Irregular Hemline +slug: >- + cfwheels-x-dresshead-short-sleeved-dress-contrasting-wrap-details-irregular-hemline +publishedAt: '2010-12-09T10:07:54.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Per Djurner +tags: [] +categories: + - Community +excerpt: >- + Soft and sexy, this Cfwheels x DressHead Short Sleeved Dress - Contrasting + Wrap Details / Irregular Hemline features a semi sheer top with a sweetheart + bodice beneath and a sensuous sleeveless styl... +coverImage: null +legacyId: '60' +--- + +Soft and sexy, this Cfwheels x DressHead Short Sleeved Dress - Contrasting Wrap Details / Irregular Hemline features a semi sheer top with a sweetheart bodice beneath and a sensuous sleeveless style. A wide, high collar is elegant against the open arms as they wrap around your body. The back has a large split in the center with two tiny buttons at the collar and an invisible closure at the waist. A narrow hem lands just below the knee and has a large vent in the back which allows you flexibility when entering or exiting a vehicle. The front of the dress has vertical ribbons with gold studs evenly spaced apart. Choose from three great jewel tone colors available for this Cfwheels x DressHead Short Sleeved Dress - Contrasting Wrap Details / Irregular Hemline dress. Small size; waist 68 cm, bust 86 cm, length 99 cm. [![](https://images.dresshead.com/images/Wrap%20Dresses/355015/large/1.jpg)](https://www.dresshead.com/short-sleeved-dress-contrasting-wrap-details-irregular-hemline/) diff --git a/web/content/blog/posts/changing-of-the-guards-at-cfwheels.md b/web/content/blog/posts/changing-of-the-guards-at-cfwheels.md new file mode 100644 index 0000000000..6eacb9e1d9 --- /dev/null +++ b/web/content/blog/posts/changing-of-the-guards-at-cfwheels.md @@ -0,0 +1,29 @@ +--- +title: Changing of the Guards at CFWheels +slug: changing-of-the-guards-at-cfwheels +publishedAt: '2022-03-29T19:12:56.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - Community +excerpt: 'Hello everyone,' +coverImage: null +legacyId: '109' +--- + +Hello everyone, + +I was waiting to have more of my thoughts and plans ironed out before posting this message, but due to the intense interest from the community I’ve decided to post what I have, however premature. + +As many of you know we have had some changes in the CFWheels core team. Several of the core team members, have decided to reduce their level of administrative involvement in the project and have stepped down from the core team. I have volunteered to take the reins of the project and we are in the middle of passing the baton as it were. + +So what does this mean for the CFWheels project?  + +Well, the fact that there is a transition in place at all, means the project will continue to live on. The CFWheels project has been around since 2005 and during that time different individuals have held the reins and guided the project along. This time is no different. I hope to be as worthy of a steward as those that have come before me. + +So what are my thoughts for the future of the project? + +From an administrative perspective I want to see what structure to adopt. Whether it is the core team structure we have had in the past or perhaps a more advisory committee structure would be better. We need to take stock of all the code in flight at the moment and try to get a roadmap sketched out. Setting up a funding structure for the project vis-á-vis Patreon.com, IssueHunt.io, BountySource.com, or OpenCollective.com. And finally looking at the legal structure of the project and if there is a need to formalize that by creating a LLC or 501.C corporation.  + +At this point I have more questions than answers but I welcome your feedback and look forward to your support. diff --git a/web/content/blog/posts/cleaner-configuration-in-wheels-3-0-less-magic-more-clarity.md b/web/content/blog/posts/cleaner-configuration-in-wheels-3-0-less-magic-more-clarity.md new file mode 100644 index 0000000000..0ff72f8946 --- /dev/null +++ b/web/content/blog/posts/cleaner-configuration-in-wheels-3-0-less-magic-more-clarity.md @@ -0,0 +1,41 @@ +--- +title: 'Cleaner Configuration in Wheels 3.0: Less Magic, More Clarity' +slug: cleaner-configuration-in-wheels-3-0-less-magic-more-clarity +publishedAt: '2026-01-21T15:04:03.000Z' +updatedAt: '2026-01-21T20:04:03.000Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - configuration + - framework-architecture + - environment-configuration +categories: + - Documentation +excerpt: >- + Configuration is one of the first things developers interact with in any + framework. In Wheels 2.5, configuration worked — but over time it became + harder to reason about where values came from, when... +coverImage: null +legacyId: '137' +--- + +Configuration is one of the first things developers interact with in any framework. In Wheels 2.5, configuration worked — but over time it became harder to reason about where values came from, when they were loaded, and which ones were safe to override. + +Wheels 3.0 introduces a cleaner, more predictable configuration system that favors explicit behavior over hidden defaults. In this article, we’ll cover: \* How configuration worked in Wheels 2.5 \* What changed in Wheels 3.0 \* Why reducing “magic” matters \* How this improves day-to-day development + +\# \*\*Configuration in Wheels 2.5\*\* In Wheels 2.5, configuration values could come from multiple places: \* Framework defaults \* Application configuration files \* Environment-specific overrides \* Implicit assumptions inside the framework While powerful, this approach had drawbacks: \* It wasn’t always clear which value won \* Some defaults were silently applied \* Debugging config-related issues required deep framework knowledge \* Behavior could vary between engines and environments In many cases, developers only discovered configuration issues \*\*after something behaved unexpectedly\*\*. + +\# \*\*What Changed in Wheels 3.0\*\* Wheels 3.0 simplifies and clarifies configuration loading by focusing on \*\*explicit intent\*\*. Key improvements include: \* Clearer separation between framework defaults and application settings \* More predictable load order \* Fewer implicit fallbacks \* Removal of legacy configuration paths \* Consistent behavior across Adobe ColdFusion, Lucee, and BoxLang The goal is simple: \*\*when you set a configuration value, it should be obvious when and how it’s used\*\*. + +\# \*\*Less Magic, More Intent\*\* One of the guiding principles of Wheels 3.0 is reducing hidden behavior. In practice, this means: \* Fewer “silent defaults” that change behavior behind the scenes \* Configuration files that do what they say — and only that \* Easier reasoning about application state Developers should not need to read framework source code to understand how configuration affects their app. + +\# \*\*A More Logical Configuration Layout\*\* In Wheels 3.0, configuration lives where you expect it to: +\`\`\` config/ app.cfm environment.cfm routes.cfm settings.cfm \`\`\` Each file has a clear responsibility: \* app.cfm — datasource and application-wide variables \* environment.cfm — environment-specific overrides \* routes.cfm — routing definitions \* settings.cfm — application-wide settings This structure encourages separation of concerns and makes it easier to locate and modify behavior. + +\# \*\*Environment Configuration Without Surprises\*\* Environment handling in Wheels 3.0 is more predictable: \* Environments are resolved earlier in the request lifecycle \* Overrides happen in a clear, documented order \* Defaults are safer for production environments This reduces cases where: \* A setting works locally but not in production \* An environment variable behaves differently across engines \* Configuration values change based on execution timing + +\# \*\*Why This Matters in Real Applications\*\* Cleaner configuration directly improves: \* Debugging time \* Onboarding new developers \* CI/CD reliability \* Cross-engine compatibility When configuration behaves predictably, developers can focus on \*\*business logic\*\*, not framework internals. + +\# \*\*Migrating from Wheels 2.5\*\* Most applications will require minimal changes, but during migration you should: \* Review existing configuration overrides \* Remove reliance on undocumented defaults \* Verify environment-specific behavior explicitly While this may surface hidden assumptions, the end result is a more stable and understandable application. + +\# \*\*Summary\*\* Wheels 3.0’s configuration improvements are not flashy — but they are foundational. By reducing hidden behavior and clarifying how configuration is loaded and applied, Wheels 3.0 offers: \* More predictable applications \* Easier debugging \* Safer defaults \* Better long-term maintainability This is part of a broader theme in Wheels 3.0: making the framework easier to reason about, one small improvement at a time. diff --git a/web/content/blog/posts/come-get-your-fresh-0-7-release.md b/web/content/blog/posts/come-get-your-fresh-0-7-release.md new file mode 100644 index 0000000000..4856541a13 --- /dev/null +++ b/web/content/blog/posts/come-get-your-fresh-0-7-release.md @@ -0,0 +1,18 @@ +--- +title: Come Get Your Fresh 0.7 Release! +slug: come-get-your-fresh-0-7-release +publishedAt: '2008-12-21T22:07:57.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + ColdFusion on Wheels(https://cfwheels.org/) is back with its triumphant 0.7 + release. We're glad to have Wheels's ORM features back, along with a complete + rewrite of the code base for improved perfo... +coverImage: null +legacyId: '20' +--- + +**[ColdFusion on Wheels](https://cfwheels.org/) is back** with its triumphant 0.7 release. We're glad to have Wheels's ORM features back, along with a complete rewrite of the code base for improved performance. We're hoping to write about great uses of the ORM features in particular in the coming weeks. **Some very capable hands went into this release.** Per Djurner completely rewrote the code base, Peter Amiri has been helping with bug fixes and documentation, and yours truly has been coordinating efforts, documentation, and redesigning the site. **There is a ton to do.** Peter, Per, and I will primarily be working together on documentation. We understand that it's all quite sparse at the moment, and we also understand that it is our biggest opportunity for standing out from the other frameworks. Be sure to [subscribe to the blog](http://feeds.feedburner.com/ColdfusionOnWheelsBlog) to stay up to date with current developments on the project. diff --git a/web/content/blog/posts/congratulate-tony-petruzzi-lead-developer.md b/web/content/blog/posts/congratulate-tony-petruzzi-lead-developer.md new file mode 100644 index 0000000000..3442112f9e --- /dev/null +++ b/web/content/blog/posts/congratulate-tony-petruzzi-lead-developer.md @@ -0,0 +1,18 @@ +--- +title: 'Congratulate Tony Petruzzi, our New Lead Developer' +slug: congratulate-tony-petruzzi-lead-developer +publishedAt: '2010-12-27T13:38:00.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We are excited to announce that Tony Petruzzi is taking on the role of lead + developer for the Wheels Core Team. Tony's technical skill and dedication to + the project will undoubtedly lead us to grea... +coverImage: null +legacyId: '59' +--- + +We are excited to announce that Tony Petruzzi is taking on the role of lead developer for the Wheels Core Team. Tony's technical skill and dedication to the project will undoubtedly lead us to great places in the future. We are already cooking up some new plans and are excited to continue on under Tony's leadership. We would also like to take a moment to thank Per Djurner, who has led the project for several years now. Much of the code and documentation have been contributed by Per, and we ultimately wouldn't be here if it weren't for his generosity. As we approach 2011, we will be focusing on ways to get the community more involved with contributing to the project. Stay tuned for more news soon. diff --git a/web/content/blog/posts/contributing-to-wheels.md b/web/content/blog/posts/contributing-to-wheels.md new file mode 100644 index 0000000000..982e31dd2e --- /dev/null +++ b/web/content/blog/posts/contributing-to-wheels.md @@ -0,0 +1,23 @@ +--- +title: Contributing to Wheels +slug: contributing-to-wheels +publishedAt: '2008-12-12T21:49:36.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + As the project has been transitioning to "one guy doing all the work" to a + true community effort, we've had a slight amount of growing pains. Of course, + this is a great problem to have. But obvious... +coverImage: null +legacyId: '16' +--- + +As the project has been transitioning to "one guy doing all the work" to a true community effort, we've had a slight amount of growing pains. Of course, this is a great problem to have. But obviously, we need a little bit of structure. In light of this, I've posted the first version of our process and guidelines for contributing to Wheels: + +- [Coding Guidelines](https://cfwheels.org/docs/chapter/coding-guidelines) +- [Documentation Guidelines](https://cfwheels.org/docs/chapter/documentation-guidelines) + +That said, we have some exciting features coming up in the next 0.8 release, and we need your help. We'll announce more details here soon. diff --git a/web/content/blog/posts/core-team-updates.md b/web/content/blog/posts/core-team-updates.md new file mode 100644 index 0000000000..df8309e5b5 --- /dev/null +++ b/web/content/blog/posts/core-team-updates.md @@ -0,0 +1,29 @@ +--- +title: Core Team Updates +slug: core-team-updates +publishedAt: '2018-09-14T16:00:15.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: [] +categories: + - Community +excerpt: Thanks to Per & Chris +coverImage: null +legacyId: '101' +--- + +## Thanks to Per & Chris + +Over the past ten years we've been very lucky to have some great developers being part of the CFWheels core team. Unfortunately every now and then, we have to let people move on to other things as their jobs or circumstances change, and sadly we've had to say goodbye to Per Djurner ([@perdjurner](https://twitter.com/perdjurner)) and Chris Peters ([@chrisdpeters](https://twitter.com/chrisdpeters)) recently. + +Both have contributed massively to CFWheels over many years: I think there are a lot of people who can blame Chris for his original series of screencasts getting them hooked (myself included!) on Wheels, and I'd wager that every CFWheels user has benefited from Per's knowledge and guidance; both of them will be missed - a huge thank you to both of them. + +## Welcome to David & Andy + +We're pleased to announce that David Belanger ([Github/dbelanger](https://github.com/dbelanger)) and Andy Bellenie ([Github/andybellenie](https://github.com/andybellenie)) have agreed to join the Core team. Andy used to be on the team a few years ago, and brings lots of years of CFWheels experience with him. David joins us from Argentina (and occasionally Canada), making us a highly international group, with Tom & Andy in the UK and Adam over in Australia (unfortunately, with very few timezone crossovers!). It's fantastic to have them on-board. + +## Up Next + +Our next milestone is finishing up a 2.1 release: Please check the [2.1 Milestone](https://github.com/cfwheels/cfwheels/milestone/21) to hear about upcoming features such as improved CORS headers, and also check the [Changelog](https://github.com/cfwheels/cfwheels/blob/master/CHANGELOG.md) for all the bug fixes and improvements already implemented since 2.0.1.  + +[](https://github.com/cfwheels/cfwheels/milestone/21) diff --git a/web/content/blog/posts/couple-blog-series.md b/web/content/blog/posts/couple-blog-series.md new file mode 100644 index 0000000000..af6b8b9066 --- /dev/null +++ b/web/content/blog/posts/couple-blog-series.md @@ -0,0 +1,28 @@ +--- +title: A Couple Wheels Blog Series +slug: couple-blog-series +publishedAt: '2009-12-02T20:26:07.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Mike Henke and Clarke Bishop have been writing some great how-to series on + using ColdFusion on Wheels. Both do a nice job of showing the steps involved + with building simple sample applications. +coverImage: null +legacyId: '5' +--- + +Mike Henke and Clarke Bishop have been writing some great how-to series on using ColdFusion on Wheels. Both do a nice job of showing the steps involved with building simple sample applications. + +[So you want to create a CFWheels application?](http://henke.ws/page.cfm/cfwheels-series) (6+1 parts) + +Mike's series for the Wheels framework similar to Dan Wilson's "So you want to" series for Model Glue:Unity. + +[Head First Rails Applied to CFWheels](http://www.resultantsys.com/index.php/cfwheels) + +Clarke demonstrates how topics in the popular book _Head First Rails_ map to Wheels. This is a great way for those of you who know a little Ruby to see how it's done in CFML. + +There are many other bloggers out there writing about Wheels, which we will feature in the coming months. But I felt that starting with a couple tutorial series was the way to go. diff --git a/web/content/blog/posts/creating-a-basic-crud-interface-with-wheels-3-0.md b/web/content/blog/posts/creating-a-basic-crud-interface-with-wheels-3-0.md new file mode 100644 index 0000000000..c373061449 --- /dev/null +++ b/web/content/blog/posts/creating-a-basic-crud-interface-with-wheels-3-0.md @@ -0,0 +1,68 @@ +--- +title: Creating a Basic CRUD Interface with Wheels 3.0 +slug: creating-a-basic-crud-interface-with-wheels-3-0 +publishedAt: '2025-07-17T19:01:13.000Z' +updatedAt: '2025-07-17T19:01:13.000Z' +author: Peter Amiri +tags: + - 3-0 + - cfwheels + - crud + - wheels + - wheels-3-0 + - wheels-dev +categories: [] +excerpt: Accompanying Video +coverImage: null +legacyId: '131' +--- + +## Accompanying Video + +This blog post has an accompanying video posted to [YouTube](https://youtu.be/paUjKmYZnrU). + +## + +Welcome to the next installment in our Wheels 3.0 tutorial series! Today, we’ll guide you through creating a basic CRUD (Create, Read, Update, Delete) interface using the Wheels CLI. If you're just joining us and don't have the Wheels CLI installed yet, be sure to catch up with our previous video detailing the setup of your development environment. + +## Setting Up Your Wheels Project + +To get started, we activate the \`WHEELS NEW\` command, which launches a wizard designed to help us build a new Wheels project efficiently. First, provide a name for your application—I'll be using "myapp" as the demonstration name. + +During the setup, you'll be prompted to select which Wheels version to install, and we’ll choose the second option for Wheels 3.0. For development purposes, we'll leave the reload password empty, but remember to set a secure password before moving to production. Next, the wizard will ask for a datasource name, which defaults to our application name and suits our needs. + +You’ll then be asked to select a CFML engine for deployment, and we’ll stick with the default, the latest version of Lucee. Since we opted for the Lucee engine, it offers the use of a built-in H2 database—a great development option that avoids setting up a separate database server. We’ll go ahead and select “yes” to use it. + +You'll have the option to include the Bootstrap CSS framework to enhance the appearance of your app. Finally, decide whether you want a box.json file for uploading the project to Forgebox.io. For this project, I’ll choose “no.” + +After confirming our settings, the wizard will download the specified 3.0 template, along with any necessary dependencies, setup the H2 database, integrate Bootstrap, and start the server. Once the installation is complete, we can explore what’s been set up. + +## Exploring the CLI Setup + +The CLI generates a default Wheels installation skeleton, which it modifies based on our inputs, such as updating configuration files and creating essentials like the URL rewrite file and a server.json file. + +Upon successful installation, the confirmation screen assures us with a set of configurations displayed on the Info tab. This includes details like application and datasource names, and confirms the H2 database driver installation with the ready-to-use datasource. + +## Creating a User Model + +Now, it’s time to create users through the CLI. In CommandBox, we use the \`wheels scaffold\` command to begin creating a User model. We’ll bypass the database migration initially but note how this step has generated skeleton view files, a model file, and a controller in the app. This default setup is crucial for the business logic and user interactions. + +To give the user model some structure, we use the command line to add properties like first name, last name, and email to the User model, although we'll skip database migrations for these incremental property additions. + +## Consolidating Migration Files + +Before executing database migrations, it’s wise to consolidate the migration files generated. Inside the app's migrator/migrations folder are several CFC files. We aim to merge these into a single file, ensuring the \`up\` and \`down\` functions are properly matched—creating a table in \`up\` and dropping it in \`down\`. + +Once consolidated, enhance the migration script by adding string-based columns for first and last names with a character limit, and a longer limit for emails, ensuring database integrity and conformity. + +## Running Migrations + +Migrations can be executed via the CLI or the application's user interface. Using the UI, navigate to the Migrator tab and run the migrations in sequence or opt for 'Migrate to Latest’ to process all migrations. + +Given that model configurations are cached, reload the application post-migration to let the framework update model configurations based on new database structures. + +## Finalizing the Application + +Lastly, make the User index the default application page rather than the Congratulations page. Modify the routes.cfm file to direct URLs to the users index route by default. Reload the application to apply this routing change, and upon revisiting the default route, the Users page should now load by default. + +This tutorial concludes our hands-on exploration of CRUD interface creation in Wheels 3.0 using CLI. We covered project setup, database configuration, scaffolding models, property additions, migration management, and front-end interfacing—all culminating in a functional application displaying user data. diff --git a/web/content/blog/posts/creating-a-mega-quick-json-api-in-cfwheels-2-x.md b/web/content/blog/posts/creating-a-mega-quick-json-api-in-cfwheels-2-x.md new file mode 100644 index 0000000000..c97600700f --- /dev/null +++ b/web/content/blog/posts/creating-a-mega-quick-json-api-in-cfwheels-2-x.md @@ -0,0 +1,14 @@ +--- +title: Creating a mega quick JSON API in CFWheels 2.x +slug: creating-a-mega-quick-json-api-in-cfwheels-2-x +publishedAt: '2018-03-12T20:28:45.000Z' +updatedAt: '2025-06-02T13:27:26.000Z' +author: Tom King +tags: + - 2-0 + - screencasts +categories: [] +excerpt: '' +coverImage: null +legacyId: '99' +--- diff --git a/web/content/blog/posts/creating-custom-urls-with-routes.md b/web/content/blog/posts/creating-custom-urls-with-routes.md new file mode 100644 index 0000000000..bfc393e034 --- /dev/null +++ b/web/content/blog/posts/creating-custom-urls-with-routes.md @@ -0,0 +1,22 @@ +--- +title: Creating Custom URLs in Your Wheels App with Routes +slug: creating-custom-urls-with-routes +publishedAt: '2008-12-18T21:21:35.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Today, I released a chapter in the Documentation(http://www.cfwheels.com/docs) + called Using Routes(http://www.cfwheels.com/docs/chapter/using-routes). Routes + are a pretty cool feature of Wheels bec... +coverImage: null +legacyId: '11' +--- + +Today, I released a chapter in the [Documentation](http://www.cfwheels.com/docs) called [Using Routes](http://www.cfwheels.com/docs/chapter/using-routes). Routes are a pretty cool feature of Wheels because they let you step outside of the URL convention that can sometimes feel like shackles. As I outline in the new chapter, you can create a URL like this: http://www.domain.com /user/johndoe With this line of code in your config/routes.cfm file: + + + +[Read on](http://www.cfwheels.com/docs/chapter/using-routes) to find out how it all works. diff --git a/web/content/blog/posts/debugging-plugin-performance-in-cfwheels-2-x-with-fusionreactor.md b/web/content/blog/posts/debugging-plugin-performance-in-cfwheels-2-x-with-fusionreactor.md new file mode 100644 index 0000000000..63fa0e7424 --- /dev/null +++ b/web/content/blog/posts/debugging-plugin-performance-in-cfwheels-2-x-with-fusionreactor.md @@ -0,0 +1,45 @@ +--- +title: Debugging plugin performance in CFWheels 2.x with FusionReactor +slug: debugging-plugin-performance-in-cfwheels-2-x-with-fusionreactor +publishedAt: '2020-03-05T16:13:48.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 2-0 + - 2-1 +categories: + - Tutorials +excerpt: The Issue +coverImage: null +legacyId: '105' +--- + +## The Issue + +Shortly after the release of CFWheels 2.0, we started to get reports of slower running requests under certain conditions. For instance, a page which might have had 1000 calls to \`linkTo()\` could take anything from 1-2ms to 5-6ms a call, which, after 1000 iterations, is one hell of a performance bottle neck. In 1.x, the same call would be between 0-1ms, usually with a total execution time of sub 200ms.  + +This behaviour was something which could be proven by a developer, but not everyone was seeing the same results: what was the difference? Plugins (or rather, plugins which override or extend a core function, like `linkTo()`). To make matters worse, the performance degradation was doubled for each plugin, so you might get 1-2ms for 1 plugin, 2-4 ms for adding another plugin and so on. + +So what was causing this? + +## Enter FusionReactor + +We approached FusionReactor, who were kind enough to give us a temporary licence to help debug the issue (it's great when companies support open-source!). So next up were some tests to help diagnose the issue. + +Installing FusionReactor was really simple. As we use CommandBox locally, we could just utilise the existing module via `install commandbox-fusionreactor` to bootstrap FusionReactor onto our local running servers, which gave us access to the FR instance, already plumbed in. As we were looking for a specific line of code, we also installed the FusionReactor Lucee Plugin and configured it track CFML line execution times using the CF line performance explorer. + +This was instantly illuminating, and tracked the problem to our new `pluginrunner()` method. When we released CFWheels 2.0, there was a fairly heft rewrite of the plugins system. It was designed to be able to allow for plugins to be chained, and execute in a specific order, so you could hypothetically have the result from one plugin overriding the previous one in the chain. + +The way it did this was by creating a "stack" of plugins in an array, working out where it was in that stack, and executing the next plugin in the stack till it reached the end. It did that via a combination of `callStackGet()` and `getFunctionCalledName()` function to do the comparison. + +As you can see from the screenshot below, the line debugger clearly highlights this. This app had four plugins, two of which extended core functions. + +[![](https://cfwheels.org/blog/wp-content/uploads/2020/03/Untitled-1-1024x597.png)](https://cfwheels.org/blog/wp-content/uploads/2020/03/Untitled-1.png) + +Example of FR Lucee 4 Line Debugger + +`callStackGet()` gets invoked 2364 times in this example, but appeared performant, only causing 10ms execution time. `getFunctionCalledName()` is called the same number of times, but has a total execution time of 2242ms(!). We had our potential culprit. Either way, it was looking like the combination of calling the stack and trying to find the calling function name which was causing so much pain. I suspect it's to do with how Java deals with this: I think it might be calling a full stack trace and writing it to disk on each call - at least that was the hint from FusionReactor's thread profiler (I'm sure those who have a better understanding of Java's underlying functions will chip in). + +After some deliberation, we decided to revert this behaviour in CFWheels 2.1 back to how it used to work in 1.x, as the vast majority weren't using it, but were being affected by it. We'd seen no plugins in the wild which used this behaviour either, which was largely undocumented. + +Obviously thanks to FusionReactor for helping us out - hopefully this gives some insight into just one of the ways FusionReactor can be used. Maybe one day I'll understand Java stack traces - maybe. diff --git a/web/content/blog/posts/documentation-updates-pages-sending-email-configurations.md b/web/content/blog/posts/documentation-updates-pages-sending-email-configurations.md new file mode 100644 index 0000000000..ceb7e83cc2 --- /dev/null +++ b/web/content/blog/posts/documentation-updates-pages-sending-email-configurations.md @@ -0,0 +1,18 @@ +--- +title: 'Documentation Updates: Pages, Sending Email, and Configurations' +slug: documentation-updates-pages-sending-email-configurations +publishedAt: '2009-12-17T20:36:33.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We have 2 new chapters and 1 updated chapter in the + Documentation(http://www.cfwheels.org/docs). First, Per wrote a chapter about + Pages(http://www.cfwheels.org/docs/chapter/pages), which basically ... +coverImage: null +legacyId: '31' +--- + +We have 2 new chapters and 1 updated chapter in the [Documentation](http://www.cfwheels.org/docs). First, Per wrote a chapter about [Pages](http://www.cfwheels.org/docs/chapter/pages), which basically sums up a variety of ways that the view layer works to make your live as a developer easier. Raul and Per worked together on a new chapter about [Sending Email](http://www.cfwheels.org/docs/chapter/sending-email) using the sendEmail() function. This is a powerful way to send different types of emails using templating and layout patterns similar to what's available in Wheels's view functionality. Lastly, I updated the [Configuration and Defaults](http://www.cfwheels.org/docs/chapter/configuration-and-defaults) chapter. I realized that we had left out some details as well as a full listing of what built-in configuration options are available. Enjoy. Please continue providing feedback about the framework. We can't do this without you guys! diff --git a/web/content/blog/posts/download-0-9-3.md b/web/content/blog/posts/download-0-9-3.md new file mode 100644 index 0000000000..f301457b14 --- /dev/null +++ b/web/content/blog/posts/download-0-9-3.md @@ -0,0 +1,43 @@ +--- +title: Download ColdFusion on Wheels 0.9.3 +slug: download-0-9-3 +publishedAt: '2009-12-10T20:27:47.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Wheels matures a little more with version 0.9.3. Download it + today.(http://www.cfwheels.org/download) For those of you upgrading from + Wheels 0.9.2, the most that you'll probably need to do is delet... +coverImage: null +legacyId: '6' +--- + +Wheels matures a little more with version 0.9.3. [Download it today.](http://www.cfwheels.org/download) For those of you upgrading from Wheels 0.9.2, the most that you'll probably need to do is delete the wheels folder from your install and replace it with the new wheels folder. Voila! What's new in this release? + +## Bug Fixes + +- Fixes to make Wheels run better on [Railo 3.1](http://www.getrailo.com/) and the upcoming [Adobe ColdFusion 9](http://labs.adobe.com/wiki/index.php/Centaur). +- Fix to make it possible to use routes in forms. +- Fix so that functions added to the events/functions.cfm file are globally available in the application and not just from ColdFusion events. +- Fixes to the Oracle database adapter. +- Fixes to make the ORM work better when mapping properties to columns with different names. +- …and more minor fixes. + +## Feature Enhancements + +- [Partials](http://www.cfwheels.org/docs/chapter/partials) now allow you to pass a query, which will cause the partial to be run for every record in the query. +- Improvement to the simpleFormat() function. +- Improvements for display of [pagination links](http://www.cfwheels.org/docs/chapter/displaying-links-for-pagination). +- For security reasons, Wheels will now abort all requests that don't go through index.cfm or rewrite.cfm in the root. + +## New Functionality + +- Added 3 new [object callback](http://www.cfwheels.org/docs/chapter/object-callbacks) types: afterNew(), afterFind(), and afterInitialization(). +- Support for the PostgreSQL DBMS. +- Support for setting default values on objects based on the database settings (through the new(), create(), and save() methods). +- New dependent setting for [associations](http://www.cfwheels.org/docs/chapter/associations), which decides which join type to use in queries and whether or not to delete associated objects when the parent is deleted. + +Watch for updates to the [Documentation](http://www.cfwheels.org/docs) over the next few days. diff --git a/web/content/blog/posts/getting-started-video-tutorial.md b/web/content/blog/posts/getting-started-video-tutorial.md new file mode 100644 index 0000000000..ce376c3435 --- /dev/null +++ b/web/content/blog/posts/getting-started-video-tutorial.md @@ -0,0 +1,18 @@ +--- +title: Getting Started Video Tutorial +slug: getting-started-video-tutorial +publishedAt: '2008-12-10T21:55:55.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Peter Amiri +tags: [] +categories: + - Community +excerpt: >- + \Update: A newer version of this has been released as a "Hello World" + tutorial. We've updated with that with a link to the new video rather than the + old one.\ Here is the first Wheels video tutoria... +coverImage: null +legacyId: '19' +--- + +_\[Update: A newer version of this has been released as a "Hello World" tutorial. We've updated with that with a link to the new video rather than the old one.\]_ Here is the first Wheels video tutorial. To be honest it's the first screen cast I've created also, but I think the quality turned out pretty good. This tutorial covers how to download and install the latest Wheels build, create a couple of pages, add dynamic content to the pages, link the pages together, and finally modify the default framework settings so one of the new pages is displayed as the default page. [Watch Hello World Screencast](https://cfwheels.org/screencasts/view/6) diff --git a/web/content/blog/posts/getting-the-example-app-up-and-running.md b/web/content/blog/posts/getting-the-example-app-up-and-running.md new file mode 100644 index 0000000000..b5b6c70b39 --- /dev/null +++ b/web/content/blog/posts/getting-the-example-app-up-and-running.md @@ -0,0 +1,54 @@ +--- +title: Getting the Example App Up and Running +slug: getting-the-example-app-up-and-running +publishedAt: '2022-03-30T22:03:00.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - Community +excerpt: >- + Have you looked at the CFWheels Example App lately? If you're wondering, wait, + there is an example app?, you're not alone. Tom has done a great job putting + the CFWheels Example App together but his... +coverImage: null +legacyId: '111' +--- + +Have you looked at the CFWheels Example App lately? If you're wondering, wait, there is an example app?, you're not alone. Tom has done a great job putting the CFWheels Example App together but historically getting it up and running was somewhat difficult. It requires a database to be setup, a datasource to be defined, and migrations to be run. + +With the help of our new templating structure and some improvements to the CFWheels-CLI commands, getting the Example application is a piece of cake. All you need to do is issue three commands inside a CommandBox shell and the app magically opens up in your browser. + +So lets get started: + +``` +wheels g app name=example datasourceName=exampleh2 template=cfwheels-template-example-app --setupH2 +package install +server start +``` + +So what do those commands do for us. The first line is the longhand way to install a fresh CFWheels app using one of the published templates from Forgbox.io. This command gives the application a name, sets up a datasource, and configures it to use the built in H2 database in the Lucee CF Engine. (Are you wondering, wait, Lucee has a built in database engine?) The next line installs all our development and production dependencies into our application directory. Lastly we start the Lucee server and the application launches in our default browser. + +You'll initially see the installation verification screen. + +[![](https://cfwheels.org/blog/wp-content/uploads/2022/03/Screen-Shot-2022-03-30-at-11.48.06-AM-1024x614.png)](https://cfwheels.org/blog/wp-content/uploads/2022/03/Screen-Shot-2022-03-30-at-11.48.06-AM.png) + +Once you click on the Reload button, the application will reload and launch the Example App. + +[![](https://cfwheels.org/blog/wp-content/uploads/2022/03/Screen-Shot-2022-03-30-at-11.49.16-AM-1024x614.png)](https://cfwheels.org/blog/wp-content/uploads/2022/03/Screen-Shot-2022-03-30-at-11.49.16-AM.png) + +At this point you can login using one of the default user ID listed below. + +``` +user: admin@domain.com +user: editor@domain.com +user: user@domain.com +user: user2@domain.com +user: user3@domain.com (Pending Verification) +``` + +All of them have the password set to `Password123!` + +I hope you enjoy playing with this Example App and it serves as a learning tool as it was intended. Please share your experience in the comments below. + +EDIT: The Lucee server that starts up will have `cfwheels` set as its admin password. diff --git a/web/content/blog/posts/hello-database-tutorial.md b/web/content/blog/posts/hello-database-tutorial.md new file mode 100644 index 0000000000..61af4c320d --- /dev/null +++ b/web/content/blog/posts/hello-database-tutorial.md @@ -0,0 +1,19 @@ +--- +title: Hello Database Tutorial +slug: hello-database-tutorial +publishedAt: '2009-12-11T21:00:44.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + As a follow-up to the Hello + World(http://www.cfwheels.org/docs/chapter/beginner-tutorial:-hello-world) + tutorial, we've just released a tutorial called Hello + Database(http://www.cfwheels.org/docs/ch... +coverImage: null +legacyId: '36' +--- + +As a follow-up to the [Hello World](http://www.cfwheels.org/docs/chapter/beginner-tutorial:-hello-world) tutorial, we've just released a tutorial called [Hello Database](http://www.cfwheels.org/docs/chapter/beginner-tutorial:-hello-database). As its name suggests, the point of this new tutorial is to help you get a jump start on learning about Wheels's ORM functionality. This is not an exhaustive walk-through but rather a taste so you can dip your toe into the pool. If you've been on the fence on whether you'd like to try ColdFusion on Wheels, [give the tutorial a read](http://www.cfwheels.org/docs/chapter/beginner-tutorial:-hello-database). diff --git a/web/content/blog/posts/help-us-test-the-coldfusion-on-wheels-1-1-4-release-candidate.md b/web/content/blog/posts/help-us-test-the-coldfusion-on-wheels-1-1-4-release-candidate.md new file mode 100644 index 0000000000..848b9a1e2c --- /dev/null +++ b/web/content/blog/posts/help-us-test-the-coldfusion-on-wheels-1-1-4-release-candidate.md @@ -0,0 +1,20 @@ +--- +title: Help us test the ColdFusion on Wheels 1.1.4 release candidate +slug: help-us-test-the-coldfusion-on-wheels-1-1-4-release-candidate +publishedAt: '2011-07-06T03:20:17.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: + - 1-1 +categories: + - Releases +excerpt: >- + Tony just built a release candidate with changes slated for ColdFusion on + Wheels 1.1.4, and we've made it available for + download(/files/downloads/cfwheels.1.1.4-rc-1.zip). This release includes + som... +coverImage: null +legacyId: '68' +--- + +Tony just built a release candidate with changes slated for ColdFusion on Wheels 1.1.4, and we've made it available for [download](/files/downloads/cfwheels.1.1.4-rc-1.zip). This release includes some stability and bug fixes. But most notably, version 1.1.4 now allows you to develop plugins without needing to have a dummy zip file packaged. Just create the plugin directory and start coding your plugin. Help us test this out in your environment so we can be sure that 1.1.4 is ready to go! diff --git a/web/content/blog/posts/how-oo-almost-destroyed-business.md b/web/content/blog/posts/how-oo-almost-destroyed-business.md new file mode 100644 index 0000000000..6e1e823df6 --- /dev/null +++ b/web/content/blog/posts/how-oo-almost-destroyed-business.md @@ -0,0 +1,19 @@ +--- +title: How OO Almost Destroyed a Business +slug: how-oo-almost-destroyed-business +publishedAt: '2009-12-24T20:47:50.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + I stumbled across an honest account by Marc Funaro about how OO almost + destroyed his + business(http://www.advantexllc.com/blog/post.cfm/how-oo-almost-destroyed-my-business). + He spares no detail in t... +coverImage: null +legacyId: '33' +--- + +I stumbled across an honest account by Marc Funaro about [how OO almost destroyed his business](http://www.advantexllc.com/blog/post.cfm/how-oo-almost-destroyed-my-business). He spares no detail in the post, but I still think it is worthwhile to read in its entirety as a reality check for yourself. Dynamic languages like PHP and CFML have been on a quest over the past few years to be more "Java-like," adding more object oriented capabilities. These features bring a lot of promise for your code to become self-documenting and organized. But there have been undercurrents by pragmatists who contest that these features add unnecessary complexity for languages that were "fine just the way they were." As I've progressed through my career with ColdFusion, I've started agreeing more with the pragmatists. While ColdFusion experts have been arguing about "XML versus no-XML" over the past year, I've strongly desired _getting my work done_ so I could feel some accomplishment and have a fresh breath of air away from my computer from time to time. With my personal experience, this is where ColdFusion on Wheels has entered and really brought the fun back into ColdFusion development. One thing that Wheels has done for me is use CFCs to organize my code and make database queries easier. But at the same time, **I don't feel like I'm wasting too much time worrying about the design of my objects**. It all just flows and works organically, and it all works that way simply by following conventions that we've laid out for you. I will forever be amazed at what David Heinemeier Hansson has accomplished by implementing the concepts of Ruby on Rails and what these concepts accomplish for me in my life as a CFML developer through my use of ColdFusion on Wheels. If you at all have felt CFML lose its magic in a way that Marc Funaro described so well, [give Wheels a try](https://cfwheels.org/download). The more you uncover about our framework, the more it _just makes sense_. Our framework considers what ColdFusion as a platform does well and sticks with that. ColdFusion returns recordsets lightning-fast, so Wheels's findAll() methods return recordsets instead of CF's notoriously slow objects. (It also uses objects to represent data when that makes sense.) Wheels also helps you easily understand where your URLs point to in your code with its controller conventions. And hell, I'll even offer up the fact that Wheels's default URL behavior doesn't even give regard to the underlying platform. [Having URLs that end with .cfm, .aspx, .jsp, etc. do nothing to contribute to the overall user experience anyway](http://www.w3.org/Provider/Style/URI "Cool URIs don't change"). These sentiments bring me a lot of hope for Wheels's role in the CFML community. We're pushing forward and helping you develop beautiful code using _the best_ platform for developing web applications, period. diff --git a/web/content/blog/posts/internal-documentation-in-cfwheels-2-0-beta.md b/web/content/blog/posts/internal-documentation-in-cfwheels-2-0-beta.md new file mode 100644 index 0000000000..2260eca523 --- /dev/null +++ b/web/content/blog/posts/internal-documentation-in-cfwheels-2-0-beta.md @@ -0,0 +1,52 @@ +--- +title: Internal Documentation in CFWheels 2.0-beta +slug: internal-documentation-in-cfwheels-2-0-beta +publishedAt: '2017-05-08T12:15:50.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 2-0 +categories: + - Documentation + - Tutorials +excerpt: >- + One of a developer's biggest time sinks is coming up with and writing accurate + and engaging documentation. Even if it's an internal project with.. well, just + you... it's still incredibly valuable t... +coverImage: null +legacyId: '88' +--- + +One of a developer's biggest time sinks is coming up with and writing accurate and engaging documentation. Even if it's an internal project with.. well, just you... it's still incredibly valuable to have: coming back to projects a few months or even years later can often lead to a bit of head scratching and screams of "why?", especially with your own code. Whilst we're not promising that CFWheels will write all your documentation for you, we have put some tools in place to hopefully make the process a little less painful. With a small amount of adjustment in how you document your core functions, documentation doesn't necessarily have to be such a time consuming process. + +### Browse the Core API + +The first thing to notice is the new '\[View Docs\]' link in the debug section in the footer: [![](https://cfwheels.org/blog/wp-content/uploads/2017/05/cfw_docs_1.png)](https://cfwheels.org/blog/wp-content/uploads/2017/05/cfw_docs_1.png) Following that link leads you to the internal documentation. This is a dynamically created set of documention created via javaDoc commenting in the main CFWheels Core. [![](https://cfwheels.org/blog/wp-content/uploads/2017/05/cfw_docs_2.png)](https://cfwheels.org/blog/wp-content/uploads/2017/05/cfw_docs_2.png) The three column layout is designed to allow for quick filtering by section or function name. On the left are the main CFWheels core categories, such as Controller and Model functions, which are then broken down into sub categories, such as Flash and Pagination functions etc. Clicking on a link in the first column will filter the list in the second  and third columns with all the functions which match (including child functions of that category). Filtering by function name is made simple by a "Filter as you type" search field in the second column, so getting to the right function should be very quick. The third column contains the main function definition, including tags, parameters and code samples. + +### How is it generated? + +Each function in the core is now appropriately marked up with javaDoc style comments. This, combined with `getMetaData()` allows us to parse the markup into something useful. https://gist.github.com/neokoenig/8405738d398b8555532fe0d1f0e21cca The `[section]` and `[category]` tags categorise the function as appropriate, and the `@html` part describes the function's parameter. The additional parameter data, such as whether it's required, type and any defaults are automatically parsed too. This results in a display like: [![](https://cfwheels.org/blog/wp-content/uploads/2017/05/cfw_docs_3.png)](https://cfwheels.org/blog/wp-content/uploads/2017/05/cfw_docs_3.png) + +### Documenting your own functions + +Any function which is available to `Controller.cfc` or `Model.cfc` is automatically included; if there's no javaDoc comment, then they'll appear in `uncategorized`. But of course, there's nothing stopping you creating your own `[section]` and `[category]` tags, which will then automatically appear on the left hand column for filtering: you're not restricted to what we've used in the core. As an example, if you wanted to document all your filters, you might want to have a `[section: Application]` tag, with `[category: filters]`.  This way, your **application documentation grows as you create it**. Something as simple as a sublime text snippet for a new function which includes the basic javaDoc skeleton can get you in the habit pretty quickly! + +### Plugins too! + +We also introspect plugins for the same markup. We encourage plugin authors to adjust their plugin code to include `[section: Plugins]` at the very least. We do appreciate it will take a while for the plugin eco-system to catch up with this though. More on plugins later. + +### Exports & Re-use + +You can export the docs via JSON just by changing the URL string: i.e `?controller=wheels&action=wheels&view=docs&type=core&format=json` You could also include the functions used to create the docs and create your own version (perhaps useful for a CMS or other application where you have internal documentation for authenticated users). Whilst this isn't officially supported (the main functions may be subject to change!) it is technically possible. The best example is the thing itself - see [the main output](https://github.com/cfwheels/cfwheels/blob/master/wheels/public/docs/core.cfm) if you're interested. Please note that the user interface isn't available in production mode (for obvious reasons we hope!), so if you wanted to expose this data to an end user, you would probably need to "roll your own" with this approach. + +### Updating + +Note that the CFC introspection doesn't automatically happen on every request, so you will need to `?reload=true` to see changes to your code. Additionally, Adobe ColdFusion is more aggressive in caching CFC metadata, so depending on your settings, you may not see changes until a server restart. + +### Code samples + +Whilst the core has additional code samples which can be loaded from text files, there's no support for your application functions to take advantage of this yet. + +### Roadmap + +Whilst this API/function explorer is a great first step, you'll notice your controller and model specific functions aren't included (only those shared amongst controllers, or in the `/global/functions.cfm` file. This is because we're only looking at the main `Model.cfc` and `Controller.cfc` and what it can access. In CFWheels 2.1, we'll look at adding a full Controller and Model metadata explorer using the same techniques, and map functions like `show()` to their respective routes too. diff --git a/web/content/blog/posts/introducing-wheels-3-0-a-new-era-for-cfml-development.md b/web/content/blog/posts/introducing-wheels-3-0-a-new-era-for-cfml-development.md new file mode 100644 index 0000000000..72a093cbbd --- /dev/null +++ b/web/content/blog/posts/introducing-wheels-3-0-a-new-era-for-cfml-development.md @@ -0,0 +1,19 @@ +--- +title: 'Introducing Wheels 3.0: A New Era for CFML Development' +slug: introducing-wheels-3-0-a-new-era-for-cfml-development +publishedAt: '2026-01-12T04:15:07.000Z' +updatedAt: '2026-01-12T22:45:54.000Z' +author: Peter Amiri +tags: + - wheels-3-0 + - releases +categories: [] +excerpt: >- + Today, we're thrilled to announce the release of Wheels 3.0 — the most + significant update in the framework's history. This release marks not just a + version bump, but a complete evolution of the pro... +coverImage: null +legacyId: '134' +--- + +Today, we're thrilled to announce the release of Wheels 3.0 — the most significant update in the framework's history. This release marks not just a version bump, but a complete evolution of the project, including a rebrand from CFWheels to simply Wheels. # A Fresh Identity With version 3.0, we've embraced a new identity: \* New Name: CFWheels → Wheels \* New Domain: https://wheels.dev (from cfwheels.org) \* New Home: https://github.com/wheels-dev/wheels This rebrand reflects our commitment to modernization while honoring our Rails-inspired heritage. Wheels continues to be the convention-over-configuration MVC framework that makes CFML development a joy. \*\*What's New in 3.0\*\* \*Modernized Architecture\* The project structure has been completely redesigned for cleaner separation of concerns: \* Core Outside App Root: Wheels core now lives in /vendor/wheels, keeping your application code cleanly separated from framework internals \* Updated Mappings: Simplified Application.cfm configuration \* Modular Design: Better support for modern dependency management # Powerful New CLI The wheels CLI has been completely rewritten with powerful new commands: \*\*Initialize project with Docker support\*\* wheels docker init \*\*Environment management\*\* wheels env setup \*\*Database operations (now with Oracle support!)\*\* wheels db create wheels db drop \*\*Run tests with watch mode\*\* wheels test run wheels test watch \*\*Generate scaffolds, models, controllers, and more\*\* wheels g scaffold Post properties="title:string,content:text,published:boolean" \*\*Expanded Database Support\*\* Wheels 3.0 runs on more databases than ever: \* Oracle: Full support in CLI and ORM \* SQLite: New adapter with automatic datetime handling \* MySQL, PostgreSQL, SQL Server, H2: Updated to latest versions \*\*BoxLang Compatibility\*\* Looking to the future? Wheels 3.0 is compatible with https://boxlang.io, the next-generation JVM language from Ortus Solutions. Run your Wheels apps on Lucee, Adobe ColdFusion, or BoxLang — your choice. \*\*Enhanced Model Layer\*\* \* ignoreColumns(): New method to exclude specific columns from ORM mapping \* Race Condition Handling: Improved model initialization with automatic recovery \* Performance Boost: Significant findAll() optimizations \* Native Query Support: Better returnType handling \*\*Modern Testing Infrastructure\*\* \* Rewritten TestUI: Beautiful Vue-based test runner interface \* TestBox 6.0: Updated to the latest TestBox with full BDD support \* Expanded Matrix: Tested on Lucee 5/6/7, Adobe ColdFusion 2021/2023/2025, and BoxLang \*\*Developer Experience\*\* \* VSCode Extension: New extension with IntelliSense, snippets, and API documentation \* macOS Installer: One-click installation for Mac developers \* MCP Integration: AI-assisted development with Model Context Protocol support # Getting Started \*New Projects\* \*\*Install the CLI\*\* box install wheels-cli \*\*Create a new Wheels 3.0 application\*\* wheels g app myapp cd myapp server start \*\*Upgrading from 2.x\*\* Before upgrading, review the breaking changes: 1. Project Structure: Update your Application.cfm mappings for the new core location 2. Dependencies: Wheels 3.0 requires WireBox 7.0+ and TestBox 6.0+ 3. Migrations: The null parameter is now allowNull See our https://wheels.dev/3.0.0/guides/introduction/upgrading for detailed instructions. # Thank You Wheels 3.0 represents months of work from our incredible community. Special thanks to: \* Zain Ul Abideen for the tireless CLI development, BoxLang compatibility, Oracle support, and countless improvements \* Peter Amiri for architecture redesign, release infrastructure, and MCP integration \* Adam Chapman for the ignoreColumns() feature and model enhancements \* MvdO79 for documentation improvements and beginner tutorials \* All our contributors, testers, and community members Links \* Website: https://wheels.dev \* GitHub: https://github.com/wheels-dev/wheels \* Documentation: https://wheels.dev/guides \* Release Notes: https://github.com/wheels-dev/wheels/blob/main/CHANGELOG.md \* ForgeBox: box install wheels What's Next We're already planning Wheels 3.1 with more features and improvements. Join our community, file issues, submit PRs, and help shape the future of CFML development. Happy coding! \*The Wheels Team\* diff --git a/web/content/blog/posts/litepost-contest-ends-feb-19.md b/web/content/blog/posts/litepost-contest-ends-feb-19.md new file mode 100644 index 0000000000..3a5e21b065 --- /dev/null +++ b/web/content/blog/posts/litepost-contest-ends-feb-19.md @@ -0,0 +1,30 @@ +--- +title: LitePost Contest Ends Feb 19th +slug: litepost-contest-ends-feb-19 +publishedAt: '2010-12-18T05:33:16.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + The Learning Wheels LitePost + Contest(https://cfwheels.org/blog/index.cfm/2010/1/25/Wheels-LitePost-Contest--win-Amazon-Gift-Card + "Wheels LitePost Contest - Win Amazon Gift Card") is wrapping up on ... +coverImage: null +legacyId: '44' +--- + +The [Learning Wheels LitePost Contest](https://cfwheels.org/blog/index.cfm/2010/1/25/Wheels-LitePost-Contest--win-Amazon-Gift-Card 'Wheels LitePost Contest - Win Amazon Gift Card') is wrapping up on Feb 19th. It is meant for a quick and simple intro into Wheels. + +### Prize + +Grand Prize (one): _$100_ Amazon Gift card Runner Up Prizes (two): _$50_ Amazon Gift card Everyone: Free one year Mini Hosting Plan at [Alurium Hosting](http://alurium.com/) (over $40 value) + +### Submissions + +Please email entries to henke.mike@gmail.com include your name and your Wheels/LitePost example. Any code emailed may be used by ColdFuson On Wheels. Any try will be accepted even if not fully functioning. + +### Getting Started + +Here are two 5 minute [screencasts](https://cfwheels.org/blog/index.cfm/2010/2/3/Wheels-LitePost-Contest-screencasts 'Wheels LitePost Learning Contest Screencasts') to help you get started. Also a [blog entry](http://www.stillnetstudios.com/playing-with-cfwheels) by Ryan Stille on experience with the contest. diff --git a/web/content/blog/posts/litepost-contest-screencasts.md b/web/content/blog/posts/litepost-contest-screencasts.md new file mode 100644 index 0000000000..e2f7de0ffb --- /dev/null +++ b/web/content/blog/posts/litepost-contest-screencasts.md @@ -0,0 +1,55 @@ +--- +title: LitePost Contest Screencasts +slug: litepost-contest-screencasts +publishedAt: '2010-12-04T05:42:43.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + Here are two 5 minute screencasts to help you get started for the Wheels + Litepost Learning + Contest(https://cfwheels.org/blog/index.cfm/2010/1/25/Wheels-LitePost-Contest--win-Amazon-Gift-Card). +coverImage: null +legacyId: '23' +--- + +Here are two 5 minute screencasts to help you get started for the [Wheels Litepost Learning Contest](https://cfwheels.org/blog/index.cfm/2010/1/25/Wheels-LitePost-Contest--win-Amazon-Gift-Card). + +### Getting Started Outline + +1. Check out Litepost through SVN +2. Run the SQL query to create the Litepost tables +3. [Download Wheels](https://cfwheels.org/download) and installing +4. Configure the datasource for Wheels +5. Create a model cfc +6. Create a controller to call the model +7. Create a view + +[Getting Started Screencast link](http://www.screencast.com/t/Y2MyYjllO) + +### Getting Started Notes + +- Really, the first step is done to get the create tables sql script so we can create our Litepost tables and so you can review other frameworks implementation of Litepost. You could grab [blogTables.sql](http://litepost.googlecode.com/svn/trunk/db/blogTables.sql) and run it. +- I skipped showing setting up a ColdFusion instance and creating the Litepost datasource for time purposes. +- The [scaffolding plugin](https://cfwheels.org/plugins/listing/9) will generate the create, read, update, and delete (CRUD) functionality for you in a few seconds. + +### Creating CRUD in a few seconds Outline + +1. [Download Scaffolding Plugin](https://cfwheels.org/plugins/listing/9) and install +2. Generate User Model, View, and Controller +3. Review user interface generated +4. Review Model code generated +5. Review Controller code generated + +[Creating CRUD in a few seconds Screencast link](http://www.screencast.com/t/NTlhYzZj) + +### Creating CRUD in a few seconds Notes + +- You will have to repeat the scaffolding plugin code generation for each table needing CRUD. +- Finish the [other requirements](https://cfwheels.org/blog/index.cfm/2010/1/25/Wheels-LitePost-Contest--win-Amazon-Gift-Card#Rule) + +### Submissions + +Please email entries to henkem[...](http://www.google.com/groups/unlock?_done=/groups/profile%3Fenc_user%3D6zM7-xMAAAAsiV0AFSJpL01IhgBsQarLWMj6vob75xS36mXc24h6ww)@gmail.com include your name and your Wheels/LitePost example. Any code emailed may be used by ColdFuson On Wheels. diff --git a/web/content/blog/posts/litepost-contest-winners.md b/web/content/blog/posts/litepost-contest-winners.md new file mode 100644 index 0000000000..b0e1354fd3 --- /dev/null +++ b/web/content/blog/posts/litepost-contest-winners.md @@ -0,0 +1,30 @@ +--- +title: Learning Wheels LitePost Contest Winners +slug: litepost-contest-winners +publishedAt: '2010-12-25T23:09:25.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + We announced a Wheels LitePost Learning + Contest(https://cfwheels.org/blog/index.cfm/2010/1/25/Wheels-LitePost-Contest--win-Amazon-Gift-Card) + on January 25. The contest consisted of creating a simpl... +coverImage: null +legacyId: '42' +--- + +We announced a [Wheels LitePost Learning Contest](https://cfwheels.org/blog/index.cfm/2010/1/25/Wheels-LitePost-Contest--win-Amazon-Gift-Card) on January 25. The contest consisted of creating a simple [LitePost](http://code.google.com/p/litepost/) blogging application using Wheels. In addition to the prizes listed below, everyone also was granted a one-year Mini Hosting Plan at [Alurium Hosting](http://alurium.com/) (over $40 value). + +### Grand Prize Winner - $100 Amazon Gift Cart + +Aaron Wells [Blog Working Example](http://www.aaronwells.us/) [Source Code](http://github.com/mhenke/LitePostWheels) ![](http://www.henke.ws/images/LitePost_Home_Screenshot.png) ![](http://www.henke.ws/images/LitePost_Admin_Screenshot.png) + +### Runner Up Winners - _$50_ Amazon Gift card + +Cathy Shapiro [Source Code](http://github.com/cshapiro/Litepost_CFWheels) ![](http://www.henke.ws/images/cshapiro.jpg) Ryan Stille [Source Code](http://github.com/stillnet/cfwheels-litepost) ![](http://www.henke.ws/images/stille.jpg) + +### Comments + +"This has been a great exercise for me and has really made me more comfortable with the framework." "This is my first ever project in Wheels, and I was thrilled about the contest since it gave me a deadline. " "So far I've found this to be a pretty neat framework. I see a lot of similarity to Rails. The documentation is very good." I know the entries would really like feedback on their code. So have at it :-) diff --git a/web/content/blog/posts/litepost-contest.md b/web/content/blog/posts/litepost-contest.md new file mode 100644 index 0000000000..db12088d4e --- /dev/null +++ b/web/content/blog/posts/litepost-contest.md @@ -0,0 +1,51 @@ +--- +title: Wheels LitePost Contest - Win Amazon Gift Card +slug: litepost-contest +publishedAt: '2010-12-26T05:45:12.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + ColdFusion On Wheels is announcing a contest to create an example of + LitePost(http://en.wikipedia.org/wiki/LitePost%28bloggingapplication%29) using + Wheels The LitePost project is hosted here(http:/... +coverImage: null +legacyId: '46' +--- + +ColdFusion On Wheels is announcing a contest to create an example of [LitePost](http://en.wikipedia.org/wiki/LitePost_%28blogging_application%29) using Wheels The LitePost project is hosted [here](http://code.google.com/p/litepost/). It is a simple blogging application to compare different ColdFusion frameworks. A sql script for the tables and other framework examples are [available](http://litepost.googlecode.com/svn/trunk/). + +### Goal + +Fun exercise to learn Wheels for newbies and chance to win an Amazon Gift card. + +### Prize + +Grand Prize (one): ~$50~ _$100_ Amazon Gift card Runner Up Prizes (two): ~$25~ _$50_ Amazon Gift card Everyone: Free one year Mini Hosting Plan at [Alurium Hosting](http://alurium.com/) (over $40 value) + +### Rule + +Only one rule for the contest - create a LitePost example using Wheels philosophies such as [conventions over configuration](https://cfwheels.org/docs/chapter/conventions), no xml, [Object Relational Mapping](https://cfwheels.org/docs/chapter/object-relational-mapping), [Object Validation](https://cfwheels.org/docs/chapter/object-validation), etc. No [ColdSpring](http://www.coldspringframework.org/) requirement for component management. + +### Requirements + +- [Download](https://cfwheels.org/download) and use the Wheels framework +- Login/Logout +- Entries (Create, Read, Update, and Delete) +- Comments (Create, Read, Update, and Delete) +- Categories (Create, Read, Update, and Delete) +- Bookmarks (Create, Read, Update, and Delete) +- Use Wheels Object Validation on above items +- RSS feed (Bonus) + +Contest ends on **February 19, 2010**. Winners will be picked by me (Mike Henke). I will be taking bribes and will be partial to newbies :-) + +### Submissions + +Please email entries to henke.mike@gmail.com include your name and your Wheels/LitePost example. Any code emailed may be used by ColdFuson On Wheels. + +### Getting Started + +If you are not familiar with Wheels, review the two tutorials, [Beginner Tutorial: Hello World](https://cfwheels.org/docs/chapter/beginner-tutorial-hello-world) and [Beginner Tutorial: Hello Database](https://cfwheels.org/docs/chapter/beginner-tutorial-hello-database). The [screencasts](https://cfwheels.org/screencasts) are a great way to quickly get started. If you have more time, user group recordings are [available](http://www.carehart.org/ugtv/list.cfm?search=wheel). Direct any questions to the [Wheels Google Group](http://groups.google.com/group/cfwheels) diff --git a/web/content/blog/posts/methods-tracking-change.md b/web/content/blog/posts/methods-tracking-change.md new file mode 100644 index 0000000000..7d5d387cce --- /dev/null +++ b/web/content/blog/posts/methods-tracking-change.md @@ -0,0 +1,18 @@ +--- +title: Methods for Tracking Change +slug: methods-tracking-change +publishedAt: '2009-12-22T20:58:25.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Per gets down and dirty with a new chapter in the Documentation called Dirty + Records(https://cfwheels.org/docs/chapter/dirty-records). Really it's all + about tracking change to your database records... +coverImage: null +legacyId: '34' +--- + +Per gets down and dirty with a new chapter in the Documentation called [Dirty Records](https://cfwheels.org/docs/chapter/dirty-records). Really it's all about tracking change to your database records dynamically. [Give it a read](https://cfwheels.org/docs/chapter/dirty-records) and learn about the power of methods like hasChanged(), XXXHasChanged(), XXXChangedFrom(), changedProperties(), allChanges(), and more. diff --git a/web/content/blog/posts/moving-to-github.md b/web/content/blog/posts/moving-to-github.md new file mode 100644 index 0000000000..a5fe3a96cb --- /dev/null +++ b/web/content/blog/posts/moving-to-github.md @@ -0,0 +1,18 @@ +--- +title: ColdFusion on Wheels is moving to GitHub +slug: moving-to-github +publishedAt: '2011-01-24T19:15:52.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Tony Petruzzi +tags: [] +categories: + - Community +excerpt: >- + On Sunday, January 23, the Wheels project moved its source code hosting to + GitHub. You can now browse to the cfwheels repository on + GitHub(https://github.com/cfwheels/cfwheels), fork it, and watch ... +coverImage: null +legacyId: '63' +--- + +On Sunday, January 23, the Wheels project moved its source code hosting to GitHub. You can now browse to the [cfwheels repository on GitHub](https://github.com/cfwheels/cfwheels), fork it, and watch it for updates—all from your GitHub dashboard. This is only for the source code as we will still be using [Google Code](http://code.google.com/p/cfwheels/) for issue tracking and documentation for the time being. You maybe wondering why we are making this move and it all has to do with making it easier for community participation. Google Code has been an excellent place to host the project over the last years, but in order to get your changes into Wheels, you had to check out the source code to your local machine, make the changes, and create a patch. Once that was done, you either needed to open an issue or post something on the group to announce your patch. While this is all part of the standard development process, it's cumbersome and could be better. With GitHub, you'll be able to fork, edit, and submit a pull request to us all from the GitHub website. Once we have the pull request, we'll be able to review the changes, again right from the GitHub website. This will make it extremely easy for us to get simple documentation changes and quick code fixes. More elaborate changes will still have to go through a code review. However, having all your changes available for us to review through your fork on GitHub again makes things simpler. Thanks once again for everything you all do to make Wheels an excellent framework for CFML! diff --git a/web/content/blog/posts/moving-towards-2-x-beta.md b/web/content/blog/posts/moving-towards-2-x-beta.md new file mode 100644 index 0000000000..578fd1f2dc --- /dev/null +++ b/web/content/blog/posts/moving-towards-2-x-beta.md @@ -0,0 +1,36 @@ +--- +title: Moving towards 2.x Beta +slug: moving-towards-2-x-beta +publishedAt: '2017-05-04T16:06:49.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tom King +tags: + - 2-0 +categories: + - Documentation + - Website +excerpt: >- + It's been a while in the making (probably 9 months or more) but we're finally + rolling towards a 2.0 beta release, with just a few tickets in the queue left + before we can set it free on the world. I... +coverImage: null +legacyId: '87' +--- + +It's been a while in the making (probably 9 months or more) but we're finally rolling towards a 2.0 beta release, with just a few tickets in the queue left before we can set it free on the world. In the meantime, you may have noticed a few changes in the CFWheels ecosystem, which we've needed to do to support CFWheels 2.x properly. + +### HTTPS baby! + +Firstly, all CFWheels domains are now running over *https://,* which in this day and age, should be a given. No excuses for not doing this now. + +### guides.cfwheels.org + +"docs.cfwheels.org" has been renamed [guides.cfwheels.org](https://guides.cfwheels.org) and is where the main extended documentation and tutorials will live. This system is based on readme.io, and has been great in quickly creating some nice looking docs. We will continue to add to what's there over the beta launch too. However, it's not perfect: the API reference on there is simply not designed to take something of the scope of the CFWheels API. The page can crash mobile browsers and is a little...unwieldy at best. Adding to the extremely odd SEO of the reference section (i.e, it's not indexed at all), it's time to move it off. + +### api.cfwheels.org (alpha) + +So as docs.cfwheels.org has been deprecated, we're going to split out the API reference to a new home, [api.cfwheels.org](https://api.cfwheels.org). There's lots of good reasons for this: With CFWheels 2.x, not only has the entire core (well, *almost* the entire core) been moved to cfscript, we've also commented every single public API function with javadoc style comments. This means all the core functions you know and love now have been categorized and commented in the source code, so when pull requests come in, we can keep the documentation up to date at the same time. The 2.x core has a new built in javadoc parser, so now we can just extract a JSON file where we can power api.cfwheels.org. This also has a huge advantage - we can offer offline/built in documentation browsers from within the debug section of your app. It will even read your own functions - so your local documentation reference will be increasingly valuable. More on this in detail soon. + +### More to come! + +Over the next few weeks, we'll try and get some blog posts out detailing some of the new 2.x beta features in detail. If there's something in particular you'd like to know about, please ping a comment or find us in slack/mailing list/gitHub. diff --git a/web/content/blog/posts/new-chapter-object-validation.md b/web/content/blog/posts/new-chapter-object-validation.md new file mode 100644 index 0000000000..0dabd23503 --- /dev/null +++ b/web/content/blog/posts/new-chapter-object-validation.md @@ -0,0 +1,19 @@ +--- +title: 'New Chapter: Object Validation' +slug: new-chapter-object-validation +publishedAt: '2009-12-26T20:46:55.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Another quick announcement. We've released a chapter in the Documentation + about object + validation(http://www.cfwheels.org/docs/chapter/object-validation). Object + validation allows you to enforce bu... +coverImage: null +legacyId: '32' +--- + +Another quick announcement. We've released a chapter in the Documentation about [object validation](http://www.cfwheels.org/docs/chapter/object-validation). Object validation allows you to enforce business logic related to your data easily. It also allows you to persist your objects so that your application can communicate error messages back to the user or handle the errors in some other way. It's a very clean way of handling logic that can be very repetitive if you choose to write it all out by hand instead. diff --git a/web/content/blog/posts/new-documentation-sending-files.md b/web/content/blog/posts/new-documentation-sending-files.md new file mode 100644 index 0000000000..1b52d79adc --- /dev/null +++ b/web/content/blog/posts/new-documentation-sending-files.md @@ -0,0 +1,19 @@ +--- +title: 'New Documentation: Sending Files' +slug: new-documentation-sending-files +publishedAt: '2008-12-01T21:14:21.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Per whipped up a quick chapter on Sending + Files(http://www.cfwheels.com/docs/chapter/sending-files) with Wheels's + sendFile() function. You may feel that sending non-HTML files to the browser + is a t... +coverImage: null +legacyId: '9' +--- + +Per whipped up a quick chapter on [Sending Files](http://www.cfwheels.com/docs/chapter/sending-files) with Wheels's sendFile() function. You may feel that sending non-HTML files to the browser is a trivial task, but this functionality makes securing those files dead simple. Thanks, Per! diff --git a/web/content/blog/posts/new-documentation-using-layouts-chapter-new-tutorials.md b/web/content/blog/posts/new-documentation-using-layouts-chapter-new-tutorials.md new file mode 100644 index 0000000000..58d93099f2 --- /dev/null +++ b/web/content/blog/posts/new-documentation-using-layouts-chapter-new-tutorials.md @@ -0,0 +1,30 @@ +--- +title: 'New Documentation: Using Layouts Chapter & New Tutorials' +slug: new-documentation-using-layouts-chapter-new-tutorials +publishedAt: '2008-12-24T21:54:36.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Right now is a pretty good time to be learning ColdFusion on Wheels. You can + review the documentation that's been written and learn as we write new + chapters. So far, I'm guessing that it would be p... +coverImage: null +legacyId: '18' +--- + +Right now is a pretty good time to be learning ColdFusion on Wheels. You can review the documentation that's been written and learn as we write new chapters. So far, I'm guessing that it would be pretty easy to keep up with us! If you haven't been keeping up with the conversation in the [discussion group](http://groups.google.com/group/cfwheels), we've been producing some great new material. Up in the [Docs](https://cfwheels.org/docs) are 2 new videos and 2 new written chapters. + +## New Getting Started Tutorials + +[As he had blogged before](https://cfwheels.org/blog/index.cfm/2008/5/10/Getting-Started-Video-Tutorial), Peter has created a new [Getting Started video tutorial](https://cfwheels.org/docs/chapter/hello-world). We now have it published on the Wheels site in the new "Video Tutorials" section of the Documentation. Peter and I have also written an [accompanying Getting Started chapter](https://cfwheels.org/docs/chapter/beginner-tutorial:-hello-world) that covers most of the video's contents. + +## New Video Tutorial: Building a Blog + +Mike Haggerty has contributed a video where he [starts building a blog in Wheels](https://cfwheels.org/docs/chapter/starting-a-wheels-powered-blog). In the video, he does a great job of showing off some of Wheels's ORM and form helper capabilities. If you've been on the fence on whether or not you want to dig into Wheels, this video will probably push you over the edge! + +## New Chapter: Using Layouts + +I finally published a new chapter on [Using Layouts](https://cfwheels.org/docs/chapter/using-layouts) in Wheels. I've been working on it since November, so I hope to take some crap for that in the comments. :) Layouts are definitely worth learning about early on as they give you a solid structure for factoring out your application's header, navigation, and footer. No need for repeating that code in every single view in your app! diff --git a/web/content/blog/posts/new-tutorial-wheels-ajax-and-you.md b/web/content/blog/posts/new-tutorial-wheels-ajax-and-you.md new file mode 100644 index 0000000000..10a95fab82 --- /dev/null +++ b/web/content/blog/posts/new-tutorial-wheels-ajax-and-you.md @@ -0,0 +1,18 @@ +--- +title: 'New Tutorial: Wheels, AJAX, and You' +slug: new-tutorial-wheels-ajax-and-you +publishedAt: '2010-12-20T15:47:39.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Raúl Riera(https://cfwheels.org/user/profile/3) and I collaborated on a new + tutorial in the reference guide called Wheels, AJAX, and + You(https://cfwheels.org/docs/chapter/wheels-ajax-and-you). The ... +coverImage: null +legacyId: '54' +--- + +[Raúl Riera](https://cfwheels.org/user/profile/3) and I collaborated on a new tutorial in the reference guide called [Wheels, AJAX, and You](https://cfwheels.org/docs/chapter/wheels-ajax-and-you). The tutorial discusses 3 different ways to request and receive data from the controller using asynchronous JavaScript. While much of this may be standardized in future releases of Wheels, this tutorial gives you some fairly simple options for integrating AJAX functionality into your Wheels 1.0.x applications _today_. diff --git a/web/content/blog/posts/presentation-mdcfug-tonight.md b/web/content/blog/posts/presentation-mdcfug-tonight.md new file mode 100644 index 0000000000..fdac21b443 --- /dev/null +++ b/web/content/blog/posts/presentation-mdcfug-tonight.md @@ -0,0 +1,18 @@ +--- +title: Wheels Presentation at MDCFUG Tonight +slug: presentation-mdcfug-tonight +publishedAt: '2009-12-10T10:11:35.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Mike Henke presented about Wheels tonight at the Maryland ColdFusion User's + Group(http://www.mdcfug.org/). He gave an overview of how Wheels and MVC + frameworks work and demonstrated some code examp... +coverImage: null +legacyId: '3' +--- + +Mike Henke presented about Wheels tonight at the [Maryland ColdFusion User's Group](http://www.mdcfug.org/). He gave an overview of how Wheels and MVC frameworks work and demonstrated some code examples. Here are the slides. You can also view a [full screen version](http://docs.google.com/present/view?id=0AZZAxOdc0CBnZGMyc2I0NTRfMzI3aG1ja2M4ZHM) with speaker's notes. Thanks Mike for your efforts to get the word out there! diff --git a/web/content/blog/posts/release-candidate-1-0-rc1.md b/web/content/blog/posts/release-candidate-1-0-rc1.md new file mode 100644 index 0000000000..a33ab60f48 --- /dev/null +++ b/web/content/blog/posts/release-candidate-1-0-rc1.md @@ -0,0 +1,39 @@ +--- +title: 'The Release Candidate Is Out: Wheels 1.0 RC1' +slug: release-candidate-1-0-rc1 +publishedAt: '2009-12-02T10:21:57.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We've been + talking(https://cfwheels.org/blog/index.cfm/2008/10/28/Wheels-083-Our-Final-Beta-Release + "Wheels 0.8.3: Our Final Beta Release?") + about(https://cfwheels.org/blog/index.cfm/2009/3/4/Wheel... +coverImage: null +legacyId: '4' +--- + +We've been [talking](https://cfwheels.org/blog/index.cfm/2008/10/28/Wheels-083-Our-Final-Beta-Release 'Wheels 0.8.3: Our Final Beta Release?') [about](https://cfwheels.org/blog/index.cfm/2009/3/4/Wheels-09-The-Final-Final-Beta-Cycle 'Wheels 0.9: The Final Final Beta Cycle') getting to 1.0 for quite some time now, and the first release candidate is here. [Download ColdFusion on Wheels 1.0 RC1](https://cfwheels.org/download) + +## New Features + +We have focused primarily on getting Wheels stable and ready for a solid 1.0 release, so there aren't that many new features this time around. But we couldn't help but add a few exciting things though, like support for URL rewriting in IIS 7 and in subfolders when using Apache, to name a couple. We've also improved our plugin system a little, which has lead to a lot of new great [plugins](https://cfwheels.org/plugins) popping up on the Google Group and on the site. + +## Important Bug Fixes + +With the help of everyone in the Google Group, we have fixed between 20-30 bugs since we released 0.9.4. Thanks everyone! One bug fix worth pointing out is that we were able to work around a mapping bug in Railo that caused pages to load slowly. So if you're using Wheels on Railo you will see much faster load times after upgrading. You can view the full list of new features and bug fixes in the change log included in the download file. + +## How to Upgrade + +As usual, the easiest way to upgrade is to setup an empty website, deploy a fresh copy of Wheels, and then transfer your old application code to it. If you'd rather upgrade directly to an existing folder, here are the required steps: + +1. Replace the wheels folder, all files in the root, and the views/wheels folder with files from the 1.0 zip. +2. Add/overwrite Wheels.cfc in the models folder. +3. Add/overwrite Wheels.cfc in the controllers folder. +4. Change the "extends" attribute in controllers/Controller.cfc to "Wheels". +5. Change the "extends" attribute in models/Model.cfc to "Wheels". + +We'll be focusing on fixing any remaining bugs, continuing to unit test the API, finishing documentation, and testing plugins. Thanks everyone for your support. This framework has a bright future, and it's all because of this amazing community. diff --git a/web/content/blog/posts/release-candidate-1-1-rc-1.md b/web/content/blog/posts/release-candidate-1-1-rc-1.md new file mode 100644 index 0000000000..edc9cf6557 --- /dev/null +++ b/web/content/blog/posts/release-candidate-1-1-rc-1.md @@ -0,0 +1,19 @@ +--- +title: ColdFusion on Wheels 1.1 Release Candidate 1 +slug: release-candidate-1-1-rc-1 +publishedAt: '2010-12-27T21:03:14.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: + - 1-1 +categories: + - Community +excerpt: >- + After fixing some bugs found in the 2nd beta, we are happy to release the + first release candidate of version 1.1 of the ColdFusion on Wheels framework. + If you're currently developing with one of th... +coverImage: null +legacyId: '56' +--- + +After fixing some bugs found in the 2nd beta, we are happy to release the **first release candidate of version 1.1** of the ColdFusion on Wheels framework. If you're currently developing with one of the beta releases or are considering exploring version 1.1, we strongly encourage that you [download the RC today](https://cfwheels.org/download). As with all releases in the 1.x cycle, upgrading from a previous version is simple: just replace the wheels folder from your current install with the new wheels folder from the zip file. The [Upgrading to Wheels 1.1.x](https://cfwheels.org/docs/1-1/chapter/upgrading-wheels) chapter in the documentation outlines instructions for upgrading from previous versions. The [CHANGELOG](http://code.google.com/p/cfwheels/source/browse/trunk/wheels/CHANGELOG) outlines changes included in 1.1 RC 1. Thanks to everyone for testing, reporting errors, sharing ideas, and fixing bugs. We ask that you continue to work on your applications with this new RC 1 and help us ensure that we have a great final release! diff --git a/web/content/blog/posts/released-1-0-4.md b/web/content/blog/posts/released-1-0-4.md new file mode 100644 index 0000000000..eab7b4af66 --- /dev/null +++ b/web/content/blog/posts/released-1-0-4.md @@ -0,0 +1,29 @@ +--- +title: 'Released: ColdFusion on Wheels 1.0.4' +slug: released-1-0-4 +publishedAt: '2010-12-21T19:28:08.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Today we're releasing ColdFusion on Wheels version + 1.0.4(https://cfwheels.org/download). This release fixes another round of bugs + and adds more stability improvements. Download it now(https://cfwhe... +coverImage: null +legacyId: '50' +--- + +Today we're releasing [ColdFusion on Wheels version 1.0.4](https://cfwheels.org/download). This release fixes another round of bugs and adds more stability improvements. [Download it now](https://cfwheels.org/download), replace the wheels folder with the new one, and reload your application. If you're upgrading from a version earlier than 1.0, [follow these instructions](https://cfwheels.org/docs/chapter/upgrading-wheels). From the change log at wheels/CHANGELOG: + +- Added missing support for passing in array of model objects as options to select() - #411 +- Fixed so "afterFind" callback methods are only called once during pagination - #435 +- Added "prependOnAnchor" and "appendOnAnchor" arguments to paginationLinks() to get around an issue where the "appendToPage" string was added on anchor pages - #434 +- Fixed bug in paginationLinks() when using "appendToPage" with single page result +- Fixed bug with count() when using composite primary keys +- Fixed concurrency issue related to setting the model name on associations - #419 +- Fix for skipping duplicate columns returned from cfdbinfo when using Oracle - #437 & #439 +- Fix for race conditions when setting the join clause in an application scoped model object - #432 +- Fixed so URLFor() is not duplicating controller and action when URL rewriting is off - #433 +- Added support to imageTag() for all image types that the CFML engine supports diff --git a/web/content/blog/posts/released-1-0-5.md b/web/content/blog/posts/released-1-0-5.md new file mode 100644 index 0000000000..bfdad9d850 --- /dev/null +++ b/web/content/blog/posts/released-1-0-5.md @@ -0,0 +1,44 @@ +--- +title: 'Released: ColdFusion on Wheels 1.0.5' +slug: released-1-0-5 +publishedAt: '2010-12-18T15:27:44.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + It's my pleasure to announce the release of ColdFusion on Wheels version + 1.0.5. Upgrade now(https://cfwheels.org/download) to increase the stability of + your codebase. We noticed that there were qui... +coverImage: null +legacyId: '53' +--- + +It's my pleasure to announce the release of ColdFusion on Wheels version 1.0.5. [Upgrade now](https://cfwheels.org/download) to increase the stability of your codebase. We noticed that there were quite a few bugs being squashed in the 1.1 cycle, so we back-ported most of them into the 1.0.x codebase, and that's how 1.0.5 was born. The [CHANGELOG](http://code.google.com/p/cfwheels/source/browse/branches/1.0/wheels/CHANGELOG) lists 23 bug fixes, many reported by the community. + +- Fixed the handling for the `errorEmailServer` setting so that error emails can now be sent without having to set the server in the ColdFusion administrator +- Corrected pluralize rules +- Remove possible spaces in list passed in to callback registration +- Check to see that a function has a declaration in the settings before setting defaults +- Update to `capitalize()` to return nothing if the passed in string is empty +- `validatesPresenceOf()` now takes whitespace into account +- Fix for lock timeouts occurring during race conditions in the `design` and `development` modes +- Fix so Wheels uses passed in width/height in `imageTag()` when only one of them is passed in +- Don't append `.css`, `.js` to asset files when they end in `.cfm` +- Update to reload to catch the query blank boolean error +- `onCreate` validations do not run when `onSave` validations fail +- Fixes bug with nullable foreign keys in `where` clause +- Update to clean up variables from all scopes after running plugin injection +- Updated PostgreSQL types +- Fix for race condition when checking for existing controller files in the `design` and `development` modes +- Error in SQL Server pagination with mapped columns +- Updated `hasChanged()` for a race condition that wasn't met +- Fixed pagination error in Oracle when using the `include` argument +- Fixed incorrect layout rendering for `renderPartial()` and `includePartial()` +- Fix for complex `include` strings +- Fixed naming conflict occurring for properties starting with the same name as its model on included objects +- Fixed pluralization issue related to partials used with object(s)/queries and removed the limitation of the file being tied to the model name +- Prevent additional errors from occurring during display of CFML errors + +The upgrade cycle is still simple: replace your wheels folder with the new wheels folder from the [1.0.5 zip](https://cfwheels.org/download) and then reload your application. diff --git a/web/content/blog/posts/released-coldfusion-on-wheels-1-0-3.md b/web/content/blog/posts/released-coldfusion-on-wheels-1-0-3.md new file mode 100644 index 0000000000..c96a5e3645 --- /dev/null +++ b/web/content/blog/posts/released-coldfusion-on-wheels-1-0-3.md @@ -0,0 +1,19 @@ +--- +title: 'Released: ColdFusion on Wheels 1.0.3' +slug: released-coldfusion-on-wheels-1-0-3 +publishedAt: '2010-12-26T21:14:52.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Another maintenance release has been put up, including 13 bug fixes and + improvements. Download ColdFusion on Wheels + 1.0.3(https://cfwheels.org/download) to add more stability to your code base. + As ... +coverImage: null +legacyId: '41' +--- + +Another maintenance release has been put up, including 13 bug fixes and improvements. [Download ColdFusion on Wheels 1.0.3](https://cfwheels.org/download) to add more stability to your code base. As always, if you're already using Wheels 1.0.x, then the upgrade path is simple. All you need to do is replace the wheels folder and reload your application. Testing before pushing live probably isn't a bad idea either. ;) Thanks to the community for continuing to work together to build the best framework for CFML, period. diff --git a/web/content/blog/posts/released-today-0-9-4.md b/web/content/blog/posts/released-today-0-9-4.md new file mode 100644 index 0000000000..656eda6c03 --- /dev/null +++ b/web/content/blog/posts/released-today-0-9-4.md @@ -0,0 +1,55 @@ +--- +title: 'Released Today: ColdFusion on Wheels 0.9.4' +slug: released-today-0-9-4 +publishedAt: '2009-12-15T10:46:59.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We've just released ColdFusion on Wheels version 0.9.4 today on + CFWheels.org(https://cfwheels.org/). Thanks to Per Djurner, Tony Petruzzi, and + James Gibson for contributing new features and improvi... +coverImage: null +legacyId: '30' +--- + +We've just released ColdFusion on Wheels version 0.9.4 today on [CFWheels.org](https://cfwheels.org/). Thanks to Per Djurner, Tony Petruzzi, and James Gibson for contributing new features and improving the stability of the framework. And thanks to the community for feedback and supporting our efforts. Our presence is really starting to grow. + +## Improvements + +- There is a new labelPlacement argument on all form helpers that gives you more control over the label tag. +- The error email now includes more information and also uses the global defaults you have set on sendEmail(). +- When linking you can now leave out the controller and action arguments and the link will point to the current page. +- The rendering functions now accept a returnAs argument that you can set to "string" when you want to return the result for more processing instead of just displaying it right away. +- … and more minor changes and bug fixes. + +## New Functionality + +- All finder methods (findByKey(), findAll(), etc.) can now return either an object, multiple objects in an array, or a query result set. You can decide what you want back by setting the returnAs argument to "object", "objects" or "query". The convention is still to return an object when dealing with single records and queries when dealing with multiples. +- You can now specify a [calculated property](http://www.cfwheels.org/docs/chapter/calculated-properties) (maps to a SQL statement instead of directly to a table column) on a model that you can then reference in finders (selecting, ordering by it, etc). +- The includePartial() function can now handle an array of objects (similar to the way it can iterate over a query). +- You can pass in a field name in the group argument of includePartial(), and it will call the partial once for each group and pass in a sub query. +- When specifying a hasMany association, you can now inform Wheels to create a shortcut to an additional model through a join table (very useful when dealing with many to many relationships). +- You can now edit multiple objects of the same class in the same form, Wheels will automatically create nested structs in the params struct on the receiving end. + +## Documentation Improvements + +Along with this release, I'm personally excited to announce that all of the chapter listings are hyperlinked in the [Documentation](https://cfwheels.org/docs) section. Here's what's new: + +- [Calculated Properties](http://www.cfwheels.org/docs/chapter/calculated-properties) +- [Form Helpers and Showing Errors](http://www.cfwheels.org/docs/chapter/form-helpers-and-showing-errors) +- [Creating Your Own View Helpers](http://www.cfwheels.org/docs/chapter/creating-your-own-view-helpers) +- [Miscellaneous Helpers](http://www.cfwheels.org/docs/chapter/miscellaneous-helpers) + +We also added information to and improved the following chapters: + +- [Object Validation](http://www.cfwheels.org/docs/chapter/object-validation) +- [Object Callbacks](http://www.cfwheels.org/docs/chapter/object-callbacks) +- [Object Relational Mapping](http://www.cfwheels.org/docs/chapter/object-relational-mapping) +- [Associations](http://www.cfwheels.org/docs/chapter/associations) +- [Reading Records](http://www.cfwheels.org/docs/chapter/reading-records) +- [Partials](http://www.cfwheels.org/docs/chapter/partials) + +Now is the time to try out ColdFusion on Wheels if you've been on the fence. We're pretty much locked on features until we release 1.0 in a couple months. diff --git a/web/content/blog/posts/released-version-0-8.md b/web/content/blog/posts/released-version-0-8.md new file mode 100644 index 0000000000..0216da3fce --- /dev/null +++ b/web/content/blog/posts/released-version-0-8.md @@ -0,0 +1,24 @@ +--- +title: 'Released: ColdFusion on Wheels Version 0.8' +slug: released-version-0-8 +publishedAt: '2008-12-18T21:45:04.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + It's only been a few short months, and we're proud to already be releasing + version 0.8 of Wheels! This is an important release to everyone involved with + the project. It proves that this framework i... +coverImage: null +legacyId: '15' +--- + +It's only been a few short months, and we're proud to already be releasing version 0.8 of Wheels! This is an important release to everyone involved with the project. It proves that this framework is more than a toy and that we're heading strongly toward a 1.0 release. New accomplishments in this release: + +- Introduction of Oracle support +- Composite key support for primary keys +- Bug fixes and performance improvements + +Those running version 0.7 should follow our instructions for [Upgrading to Wheels 0.8](http://www.cfwheels.com/docs/chapter/upgrading-to-wheels-0.8). He asked me not to mention his name, but the lion's share of the work has yet again been done by **Per Djurner**. Everyone that has been following this project needs to give him major thanks for his dedication, talent, and persistence in implementing these new features. I'm also proud to say that this has largely been a community-driven release. We have had countless discussions and suggestions in our [Discussion Group](http://groups.google.com/group/cfwheels) and [Code Site](http://code.google.com/p/cfwheels/source/checkout). Keep 'em coming, everyone! diff --git a/web/content/blog/posts/released-version-1-1-3.md b/web/content/blog/posts/released-version-1-1-3.md new file mode 100644 index 0000000000..510ee266fb --- /dev/null +++ b/web/content/blog/posts/released-version-1-1-3.md @@ -0,0 +1,35 @@ +--- +title: 'Released: ColdFusion on Wheels Version 1.1.3' +slug: released-version-1-1-3 +publishedAt: '2011-03-24T21:50:43.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: + - 1-1 +categories: + - Releases +excerpt: >- + Today, we're releasing another maintenance release, ColdFusion on Wheels + version 1.1.3. This release includes several bug fixes. Upgrade + now(https://cfwheels.org/download) to increase the stability... +coverImage: null +legacyId: '65' +--- + +Today, we're releasing another maintenance release, ColdFusion on Wheels version 1.1.3. This release includes several bug fixes. [Upgrade now](https://cfwheels.org/download) to increase the stability of your Wheels applications. To upgrade from version 1.1.x, replace the wheels folder in your application to the new one included in the zip file. If you're upgrading from a version earlier than 1.1, there are [instructions and notes in the documentation](https://cfwheels.org/docs/1-1/chapter/upgrading-wheels). Here are the updates included in version 1.1.3, listed in the [CHANGELOG](http://github.com/cfwheels/cfwheels/blob/v1.1.3/wheels/CHANGELOG): + +- Allows for relative url linking to be turned off in `autoLink()` +- Allow for default argument on `sendMail()` for `from`, `to`, and `subject` +- You can now have bracket markers for all validation arguments +- Columns marked as `NOT NULL` should allow for blank strings +- Fixed issue with `$create()` supplying incorrect keys to `$query()` +- The original transaction mode would not be respected during during callbacks +- `"none"` transaction modes would never close +- Incorrect `$cache` argument +- Route formats prevented fullstops from being used in `params` +- Controller in `params` should be upper camel case +- `application` scope would not initialize in sub +- `validatesUniquenessOf()` doesn't read soft-deletes +- `paginationLinks()`: routes with page number marker variable would produce the wrong links + +We'd like to extend a heart-felt thank you to everyone for continuing to support this project, submit bugs, and help resolve issues with the framework. diff --git a/web/content/blog/posts/request-lifecycle-in-wheels-3-0-clearer-execution-order.md b/web/content/blog/posts/request-lifecycle-in-wheels-3-0-clearer-execution-order.md new file mode 100644 index 0000000000..e3e9c8517e --- /dev/null +++ b/web/content/blog/posts/request-lifecycle-in-wheels-3-0-clearer-execution-order.md @@ -0,0 +1,35 @@ +--- +title: 'Request Lifecycle in Wheels 3.0: Clearer Execution Order' +slug: request-lifecycle-in-wheels-3-0-clearer-execution-order +publishedAt: '2026-01-28T15:27:31.000Z' +updatedAt: '2026-01-28T20:27:31.000Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - request-lifecycle + - execution-order + - lifecycle-hooks + - cross-engine-consistency +categories: + - Documentation +excerpt: >- + In any web framework, when something runs is just as important as what runs. + In Wheels 2.5, the request lifecycle evolved over time and, while functional, + it wasn’t always obvious which parts of th... +coverImage: null +legacyId: '138' +--- + +In any web framework, when something runs is just as important as what runs. In Wheels 2.5, the request lifecycle evolved over time and, while functional, it wasn’t always obvious which parts of the framework executed first, which ran later, and which were safe to rely on. Wheels 3.0 introduces a \*\*clearer, more intentional execution order\*\*, making the request lifecycle easier to understand, debug, and extend. In this article, we’ll explore: \* How lifecycle execution worked in Wheels 2.5 \* The problems caused by implicit ordering \* What changed in Wheels 3.0 \* Why predictable execution timing matters # \*\*Lifecycle Behavior in Wheels 2.5\*\* In Wheels 2.5, lifecycle hooks such as: \* onApplicationStart \* onRequestStart \* onRequest \* onRequestEnd were all present, but their relative timing was not always obvious—especially when combined with: \* rendering logic \* configuration loading \* debug output \* asset injection In some cases: \* Configuration values were accessed before being fully resolved \* Rendering-related code ran earlier or later than expected \* Debug output interacted with views in surprising ways \* Behavior differed slightly between CFML engines While these issues were manageable, they made advanced customization harder and debugging more time-consuming. + +\# \*\*What Changed in Wheels 3.0\*\* Wheels 3.0 formalizes the request lifecycle into well-defined phases. At a high level, each request now follows a clearer path: 1. Environment detection 2. Configuration loading 3. Framework initialization 4. Routing resolution 5. Controller execution 6. Rendering 7. Final response handling Each phase has a clear purpose and predictable timing. This structure removes ambiguity and reduces reliance on internal side effects. + +\# \*\*Why Execution Order Matters\*\* \*\*Safer Customization\*\* When developers hook into lifecycle events, they need to know: \* Which data is available \* Which systems are initialized \* What is safe to modify With clearer execution phases, lifecycle hooks become reliable extension points rather than trial-and-error experiments. + +\*\*Fewer Cross-Engine Differences\*\* Subtle execution timing differences between: \* Adobe ColdFusion \* Lucee \* BoxLang can cause real-world bugs. By enforcing a more explicit lifecycle, Wheels 3.0 minimizes engine-specific behavior and ensures consistency across runtimes. + +\*\*Predictable Rendering Behavior\*\* Rendering is now more clearly separated from: \* request setup \* configuration resolution \* debug output This makes it easier to: \* inject assets \* modify layouts \* customize view behavior \* understand when output is finalized # \*\*Debugging Becomes Easier\*\* With a predictable lifecycle: \* Breakpoints make more sense \* Logging is more meaningful \* Issues can be reproduced consistently Developers no longer need to guess why something worked in one environment but not another. + +\# \*\*Impact on Existing Applications\*\* Most applications will continue to work as expected, but Wheels 3.0 may expose: \* reliance on undocumented timing \* assumptions about when config values are available \* logic placed in lifecycle hooks that ran “by accident” in 2.5 While this may require small adjustments, it leads to more intentional and robust code. + +\# \*\*Summary\*\* Wheels 3.0’s lifecycle clarity is not about adding new hooks or complexity — it’s about \*\*making existing behavior reliable and understandable\*\*. By defining clearer execution phases, Wheels 3.0 delivers: \* More predictable behavior \* Safer customization \* Easier debugging \* Better cross-engine consistency This improvement quietly underpins many of the other changes in Wheels 3.0 and sets the stage for more advanced features. diff --git a/web/content/blog/posts/screencast-basic-crud-interface-in-cfwheels-2-x.md b/web/content/blog/posts/screencast-basic-crud-interface-in-cfwheels-2-x.md new file mode 100644 index 0000000000..aaa93fbd23 --- /dev/null +++ b/web/content/blog/posts/screencast-basic-crud-interface-in-cfwheels-2-x.md @@ -0,0 +1,14 @@ +--- +title: 'Screencast: Basic CRUD interface in CFWheels 2.x' +slug: screencast-basic-crud-interface-in-cfwheels-2-x +publishedAt: '2018-02-28T20:02:15.000Z' +updatedAt: '2025-06-02T13:29:56.000Z' +author: Tom King +tags: + - 2-0 + - screencasts +categories: [] +excerpt: '' +coverImage: null +legacyId: '96' +--- diff --git a/web/content/blog/posts/screencast-introduction-to-unit-testing-in-cfwheels-2-x.md b/web/content/blog/posts/screencast-introduction-to-unit-testing-in-cfwheels-2-x.md new file mode 100644 index 0000000000..ea1520e0a8 --- /dev/null +++ b/web/content/blog/posts/screencast-introduction-to-unit-testing-in-cfwheels-2-x.md @@ -0,0 +1,16 @@ +--- +title: 'Screencast: Introduction to Unit Testing in CFWheels 2.x' +slug: screencast-introduction-to-unit-testing-in-cfwheels-2-x +publishedAt: '2018-05-05T17:29:02.000Z' +updatedAt: '2025-06-02T13:26:46.000Z' +author: Tom King +tags: + - 2-0 + - screencasts +categories: [] +excerpt: 'Update: (2nd part on controllers)' +coverImage: null +legacyId: '100' +--- + +## Update: (2nd part on controllers) diff --git a/web/content/blog/posts/screencast-routing-in-cfwheels-2-x-part-2.md b/web/content/blog/posts/screencast-routing-in-cfwheels-2-x-part-2.md new file mode 100644 index 0000000000..2863e551c5 --- /dev/null +++ b/web/content/blog/posts/screencast-routing-in-cfwheels-2-x-part-2.md @@ -0,0 +1,16 @@ +--- +title: 'Screencast: Routing in CFWheels 2.x - part 2' +slug: screencast-routing-in-cfwheels-2-x-part-2 +publishedAt: '2018-03-11T16:53:32.000Z' +updatedAt: '2025-06-02T13:28:44.000Z' +author: Tom King +tags: + - 2-0 + - screencasts +categories: [] +excerpt: 'Covers constraints, wildcard segments and shallow resources.' +coverImage: null +legacyId: '98' +--- + +Covers constraints, wildcard segments and shallow resources. diff --git a/web/content/blog/posts/screencast-routing-in-cfwheels-2-x.md b/web/content/blog/posts/screencast-routing-in-cfwheels-2-x.md new file mode 100644 index 0000000000..9864992304 --- /dev/null +++ b/web/content/blog/posts/screencast-routing-in-cfwheels-2-x.md @@ -0,0 +1,16 @@ +--- +title: 'Screencast: Routing in CFWheels 2.x' +slug: screencast-routing-in-cfwheels-2-x +publishedAt: '2018-03-03T15:24:47.000Z' +updatedAt: '2025-06-02T13:29:31.000Z' +author: Tom King +tags: + - 2-0 + - screencasts +categories: [] +excerpt: A quick overview of routing in Wheels 2.x +coverImage: null +legacyId: '97' +--- + +# A quick  overview of routing in Wheels 2.x diff --git a/web/content/blog/posts/screencasts-are-back.md b/web/content/blog/posts/screencasts-are-back.md new file mode 100644 index 0000000000..533d706271 --- /dev/null +++ b/web/content/blog/posts/screencasts-are-back.md @@ -0,0 +1,23 @@ +--- +title: Screencasts Are Back +slug: screencasts-are-back +publishedAt: '2009-12-13T10:25:43.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + This blog has been a little quiet lately, but believe me that plenty has been + going on behind the scenes. We've released a new section on our site for + Screencasts(https://cfwheels.org/screencasts).... +coverImage: null +legacyId: '28' +--- + +This blog has been a little quiet lately, but believe me that plenty has been going on behind the scenes. We've released a new section on our site for [Screencasts](https://cfwheels.org/screencasts). I've started a series on [building a fake social networking site](https://cfwheels.org/screencasts/series/1), and the first 2 episodes are there: + +- [Episode 1: Setting up ColdFusion on Wheels](https://cfwheels.org/screencasts/view/1) +- [Episode 2: Form Helpers](https://cfwheels.org/screencasts/view/2) + +The aim of the series is to go through a real world application and cover different topics as they are appropriate. There are plenty more episodes and standalone screencasts in the works, so be sure to subscribe via [RSS](http://feeds.cfwheels.org/cfwheels-screencasts) or [iTunes](http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=335537994). diff --git a/web/content/blog/posts/security-fixes-for-1-1-7-and-1-0-6-released.md b/web/content/blog/posts/security-fixes-for-1-1-7-and-1-0-6-released.md new file mode 100644 index 0000000000..e0f4998cf5 --- /dev/null +++ b/web/content/blog/posts/security-fixes-for-1-1-7-and-1-0-6-released.md @@ -0,0 +1,18 @@ +--- +title: Security Fix for ColdFusion on Wheels 1.1.x and 1.0.x Released +slug: security-fixes-for-1-1-7-and-1-0-6-released +publishedAt: '2011-12-14T17:36:00.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Tony Petruzzi +tags: [] +categories: + - Releases +excerpt: >- + A security vulnerability has been identified in both the 1.1.x and 1.0.x + versions of Wheels. In response, the Wheels team is releasing patches for both + the current and legacy versions. Version 1.1.... +coverImage: null +legacyId: '73' +--- + +A security vulnerability has been identified in both the 1.1.x and 1.0.x versions of Wheels. In response, the Wheels team is releasing patches for both the current and legacy versions. Version 1.1.7 is to address current version and version 1.0.6 is to address legacy versions. At this time, we encourage all users of the framework to upgrade as soon as possible. These new versions contain only the patches necessary to close the security vulnerability. No new bug fixes or enhancement features are contained. The Wheels team would like to thank Pete Freitag of [foundeo.com](http://foundeo.com/) for reporting and helping to patch the security vulnerability. [Download versions 1.1.7 and 1.0.6](https://cfwheels.org/download) diff --git a/web/content/blog/posts/starting-2nd-beta-1-1.md b/web/content/blog/posts/starting-2nd-beta-1-1.md new file mode 100644 index 0000000000..2da74cb125 --- /dev/null +++ b/web/content/blog/posts/starting-2nd-beta-1-1.md @@ -0,0 +1,24 @@ +--- +title: Starting the 2nd beta of ColdFusion on Wheels 1.1 +slug: starting-2nd-beta-1-1 +publishedAt: '2010-12-05T16:01:15.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + ColdFusion on Wheels version 1.1 Beta 2 is now available for + download(https://cfwheels.org/). The core team and community have worked + together over the past few weeks to identify and fix bugs and m... +coverImage: null +legacyId: '40' +--- + +ColdFusion on Wheels version 1.1 Beta 2 is now available for [download](https://cfwheels.org/). The core team and community have worked together over the past few weeks to identify and fix bugs and make this awesome new feature set more stable. Thanks again to everyone for making this project so enjoyable to work with. We’re getting very close to being production-ready on this, so be sure to give it a try and provide us with your feedback. I have been blogging about some of the new features of Wheels 1.1. Be sure to check them out and subscribe to my blog for more. :) + +- [Automatic data handler functions for partials](http://www.clearcrystalmedia.com/pm/automatic-data-handler-functions-partials-cfwheels-1-1/) +- [Add to the Flash with redirectTo()](http://www.clearcrystalmedia.com/pm/add-to-flash-redirectto-cfwheels-1-1/) +- [New assetQueryString setting](http://www.clearcrystalmedia.com/pm/new-assetquerystring-setting-cfwheels-1-1/) +- [Experimenting with flashMessages()](http://www.clearcrystalmedia.com/pm/experimenting-flashmessages-cfwheels/) +- [Playing around with automatic validations](http://www.clearcrystalmedia.com/pm/automatic-validations-wheels-1-1/) diff --git a/web/content/blog/posts/starting-a-new-cfwheels-project-with-the-cli.md b/web/content/blog/posts/starting-a-new-cfwheels-project-with-the-cli.md new file mode 100644 index 0000000000..78d7faa9a7 --- /dev/null +++ b/web/content/blog/posts/starting-a-new-cfwheels-project-with-the-cli.md @@ -0,0 +1,31 @@ +--- +title: Starting a New CFWheels Project with the CLI +slug: starting-a-new-cfwheels-project-with-the-cli +publishedAt: '2022-03-24T20:29:11.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: + - cli + - tutorial +categories: + - CLI + - Tips & Tricks + - Tutorials +excerpt: >- + !(https://cfwheels.org/blog/wp-content/uploads/2022/03/wheels-generate-app-larger.gif)(https://cfwheels.org/blog/wp-content/uploads/2022/03/wheels-generate-app-larger.gif) +coverImage: null +legacyId: '108' +--- + +[![](https://cfwheels.org/blog/wp-content/uploads/2022/03/wheels-generate-app-larger.gif)](https://cfwheels.org/blog/wp-content/uploads/2022/03/wheels-generate-app-larger.gif) + +If you're not using CommandBox for your CFWheels development, you're in for a treat. This is a quick post to show case how easy it is to start a new CFWheels project with the help of the the `wheels` command for CommandBox. + +If you have CommandBox installed and have the `cfwheels-cli` module installed, then simply launch CommandBox by typing `box` and then issue the command `wheels generate app myApp` . This simple command will take care of the following: + +- Create a folder in the current working directory for the project and name if **myApp** +- Copy the `cfwheels-template-base` package from ForgeBox and expand it in the root of the myApp folder +- Copy the `cfwheels-core` package from ForgeBox and expand it into the wheels folder in the root of the myApp folder +- This command also takes care of naming your app **myApp** or whatever name you pass in + +You may be asking yourself, what are all these packages you're talking about? Well, we are starting to use the package management system provided by ForgeBox and CommandBox to make distribution of sample apps easier as well as installing and updating projects based on CFWheels. More to come on these topics later but this is just to whet your appetite. diff --git a/web/content/blog/posts/submit-feedback-uservoice.md b/web/content/blog/posts/submit-feedback-uservoice.md new file mode 100644 index 0000000000..98cefb1821 --- /dev/null +++ b/web/content/blog/posts/submit-feedback-uservoice.md @@ -0,0 +1,19 @@ +--- +title: Submit Your cfwheels.org Feedback on UserVoice +slug: submit-feedback-uservoice +publishedAt: '2010-12-05T05:41:29.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + A couple weeks ago, we launched a UserVoice + forum(https://cfwheelsorg.uservoice.com/) for feedback about the Wheels + website itself. To submit feedback about our website, simply go to the website + an... +coverImage: null +legacyId: '22' +--- + +A couple weeks ago, we launched a [UserVoice forum](https://cfwheelsorg.uservoice.com/) for feedback about the Wheels website itself. To submit feedback about our website, simply go to the website and click on the red Feedback tab along the left side of the screen. You can also vote for other features and improvements that others have suggested. And hey, we've actually implemented our first idea generated from your feedback! Our first UserVoice request was implemented last week: the site-wide search engine for cfwheels.org. Now you can search through the entire website for any content or documentation that you may be looking for. We'll be reviewing data that the search engine collects to improve your experience even more. It's been pretty clear all along that feedback about the Wheels framework itself should go in our [issue tracker](http://code.google.com/p/cfwheels/issues/list), but requests for the website were starting to get mixed in with that. Now the two trackers are separate but equal. Have an idea for our website? Go ahead and [submit your idea now](https://cfwheelsorg.uservoice.com/). diff --git a/web/content/blog/posts/testing-plugins-on-cfwheels-2-x-and-travis-ci-via-commandbox.md b/web/content/blog/posts/testing-plugins-on-cfwheels-2-x-and-travis-ci-via-commandbox.md new file mode 100644 index 0000000000..ea50948f36 --- /dev/null +++ b/web/content/blog/posts/testing-plugins-on-cfwheels-2-x-and-travis-ci-via-commandbox.md @@ -0,0 +1,29 @@ +--- +title: Testing Plugins on CFWheels 2.x and Travis CI via commandbox +slug: testing-plugins-on-cfwheels-2-x-and-travis-ci-via-commandbox +publishedAt: '2017-05-31T17:25:08.000Z' +updatedAt: '2025-06-02T13:39:04.000Z' +author: Tom King +tags: + - 2-0 + - plugins + - travisci +categories: [] +excerpt: >- + One of the nicest things about CFWheels 2.x is the tighter integration with + command-line tools such as Commandbox. We can take advantage of the new + testing suite JSON return type and the new CFWhee... +coverImage: null +legacyId: '90' +--- + +One of the nicest things about CFWheels 2.x is the tighter integration with command-line tools such as Commandbox. We can take advantage of the new testing suite JSON return type and the new CFWheels CLI in Commandbox 2.x to easily build a Travis CI test. It's perhaps easiest to just show the `.travis.yml` file - this goes in the root of your gitHub plugin repository, and once you've turned on testing under Travis.org, will run your test suite on every commit. [https://gist.github.com/neokoenig/504ce0108a1caf0f19d54e87c1a8193c](https://gist.github.com/neokoenig/504ce0108a1caf0f19d54e87c1a8193c) In sum, this: + +1. Installs Commandbox +2. Installs the CFWheels CLI +3. Installs the master branch of the CFWheels repository +4. Installs your plugin from your repository (rather than the forgebox version which will be the version behind) +5. Starts the local server +6. Runs the test suite, pointing only at your plugin's unit tests + +Naturally, you could do more complex things with this, such as multiple CF Engines, and maybe even multiple CFWheels versions, but for a quick setup it's a good starting point! diff --git a/web/content/blog/posts/the-cfwheels-channel-on-cfml-slack-has-been-archived.md b/web/content/blog/posts/the-cfwheels-channel-on-cfml-slack-has-been-archived.md new file mode 100644 index 0000000000..fcee1ef213 --- /dev/null +++ b/web/content/blog/posts/the-cfwheels-channel-on-cfml-slack-has-been-archived.md @@ -0,0 +1,21 @@ +--- +title: The CFWheels Channel on CFML Slack Has Been Archived +slug: the-cfwheels-channel-on-cfml-slack-has-been-archived +publishedAt: '2022-09-12T15:40:34.000Z' +updatedAt: '2025-05-30T19:56:44.000Z' +author: Peter Amiri +tags: [] +categories: [] +excerpt: >- + Back in May 2022 we posted a blog article announcing that CFWheels has moved + to GitHub Discussions(/blog/cfwheels-has-moved-to-github-discussions). At the + time this effected the retirement of the G... +coverImage: null +legacyId: '125' +--- + +Back in May 2022 we posted a blog article announcing that [CFWheels has moved to GitHub Discussions](/blog/cfwheels-has-moved-to-github-discussions). At the time this effected the retirement of the Google mailing list and redirecting the links on the home page to the new [GitHub Discussions](https://github.com/wheels-dev/wheels/discussions) site. Now the time has come to also retire the CFWheels channel on the CFML Slack instance. + +Feel free to go back and read the original post from May that laid out the reasoning for this move but we thought it was important to reiterate our thought process once again. At the core, the reasons for this move are to move our discussions closer to the code, allowing the poster and respondent to more easily link to specific branches, files, and even lines of code. Issues can be converted to discussions if they warrant further community input or discussions promoted to an issue once an issue or feature has had open consultation and next steps identified. Discussions can be marked as answered and the specific answer identified for future reference. And most importantly, all these discussions, collaborations, and consultations are searchable and discoverable by search engines so the community as a whole reaps the benefits. + +We have seen how the move to GitHub discussions by other open source communities has benefited their community and brought their discussions closer to the codebase. We hope this move by us will be similarly fruitful. diff --git a/web/content/blog/posts/todomvc-implementation-with-cfwheels-and-htmx.md b/web/content/blog/posts/todomvc-implementation-with-cfwheels-and-htmx.md new file mode 100644 index 0000000000..ca4239a0bd --- /dev/null +++ b/web/content/blog/posts/todomvc-implementation-with-cfwheels-and-htmx.md @@ -0,0 +1,56 @@ +--- +title: TodoMVC Implementation with CFWheels and HTMX +slug: todomvc-implementation-with-cfwheels-and-htmx +publishedAt: '2022-03-29T21:31:33.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - Community + - Tips & Tricks + - Tutorials +excerpt: >- + Recently I've been playing around with HTMX and really starting to love it. So + what is HTMX? From their website(https://htmx.org): +coverImage: null +legacyId: '110' +--- + +Recently I've been playing around with HTMX and really starting to love it. So what is HTMX? From their [website](https://htmx.org): + +> htmx gives you access to  [AJAX](https://htmx.org/docs#ajax), [CSS Transitions](https://htmx.org/docs#css_transitions),  [WebSockets](https://htmx.org/docs#websockets) and [Server Sent Events](https://htmx.org/docs#sse) directly in HTML, using [attributes](https://htmx.org/reference#attributes), so you can build [modern user interfaces](https://htmx.org/examples) with the [simplicity](https://en.wikipedia.org/wiki/HATEOAS) and [power](https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm) of hypertext +> +> Introduction to htmx + +And also: + +> Why should only [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a) and [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form) be able to make HTTP requests? +> Why should only [`click`](https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event) & [`submit`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit_event) events trigger them? +> Why should only [`GET`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET) & [`POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) methods be [available](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)? +> Why should you only be able to replace the **entire** screen? +> +> By removing these arbitrary constraints, htmx completes HTML as a [hypertext](https://en.wikipedia.org/wiki/Hypertext) +> +> Motivation behind htmx + +So what does this all mean? Well, in its simplest form, it means being able to build modern web applications with the UX that users have come to expect, with the HTML, CSS, and the backend technology of your choice which in our case is CFML and CFWheels. + +So I decide to see if I could build the [TodoMVC](https://todomvc.com) project using no hand written JavaScript and only relying on HTML, CSS, and CFWheels. I downloaded the template project and took a look at the application specs to get an idea of what to implement. + +Here is the video of the running app: + +[![](https://cfwheels.org/blog/wp-content/uploads/2022/03/cfwheels-todomvc-htmx.gif)](https://cfwheels.org/blog/wp-content/uploads/2022/03/cfwheels-todomvc-htmx.gif) + +So if you want to run the app locally, you'll need to have Commandbox installed and the CFWHeels CLI commands for CommandBox installed as well. With those two items taken care of, launch a CommandBox and issue the following commands. + +``` +wheels g app name=todo datasourceName=todo template=cfwheels-todomvc-htmx --setupH2 +package install +server start +``` + +Let's look at those lines and talk about what they do. The first line `wheels g app` will download the template app from Forgbox.io and create a CFWheels application and name it `todo`. It also create a H2 database and configures the datasource for you. The next line will `install` all the dependencies of our app. These include, a few CommandBox modules to make development easier, the CFWheels core framework directory and place it into the `wheels` folder, and install the H2 drivers into our Lucee server for out application. The last line will `start` our Lucee server. I've also added a setting to automatically run the Database migrations on application startup so the database schema is created. + +You can checkout the code on [GitHub](https://github.com/bpamiri/cfwheels-todomvc-htmx). Let me know what you think. + +EDIT: The Lucee server that starts up will have `cfwheels` set as its admin password. diff --git a/web/content/blog/posts/tshirt-hosting-giveaways-cfunited.md b/web/content/blog/posts/tshirt-hosting-giveaways-cfunited.md new file mode 100644 index 0000000000..e5c1e9a8dc --- /dev/null +++ b/web/content/blog/posts/tshirt-hosting-giveaways-cfunited.md @@ -0,0 +1,30 @@ +--- +title: T-shirt and Hosting Giveaways at CFUnited 2010 +slug: tshirt-hosting-giveaways-cfunited +publishedAt: '2010-12-28T18:55:13.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Representatives from the ColdFusion on Wheels community are mingling around at + CFUnited 2010(http://cfunited.com/2010/), which was just kicked off by Adobe's + keynote. If you're around at the confer... +coverImage: null +legacyId: '62' +--- + +Representatives from the ColdFusion on Wheels community are mingling around at [CFUnited 2010](http://cfunited.com/2010/), which was just kicked off by Adobe's keynote. If you're around at the conference, come say hi to myself, [Mike Henke](https://cfwheels.org/user/profile/25), and [Chaz Chumley](https://cfwheels.org/user/profile/123). The 3 of us will be giving 3 different presentations about Wheels on Thursday afternoon: + +- [ColdFusion on Wheels - Convention Over Configuration](http://cfunited.com/2010/topics/388-coldfusion-on-wheels--convention-over-configuration) +- [Simplifying Database Code with the ColdFusion on Wheels ORM](http://cfunited.com/2010/topics/428-simplify-database-code-with-the-coldfusion-on-wheels-orm) +- [BOF: CFWheels - Finally, a Framework for the Rest of Us](http://cfunited.com/2010/topics/445-bof-cfwheels--finally-a-framework-for-the-rest-of-us) + +If you run across us, we're giving out some awesome t-shirts designed by Raul Riera and his dev shop, [Hipervinculo](http://www.hipervinculo.net/). + +![T-shirt reads: "FINALLY, a framework for the rest of us"](https://cfwheels.org/blog/wp-content/uploads/2010/07/cfunited-tshirt-1.jpg) + +**Wear your shirt at the conference on Thursday, find one of us, and we'll also giving you a 6-month trial of [Alurium](http://alurium.com/)'s Railo hosting (the shared hosting [Mini Plan](https://alurium.com/clients/cart.php?gid=1)).** This is a great opportunity to give Railo and Wheels a try because [all Alurium accounts come with ColdFusion on Wheels pre-installed](http://alurium.com/2010/02/05/cfwheels-preinstalled-into-hosting-accounts/). And to pump you up even more, this is how cool you can look wearing the shirt. (I probably won't be giving up my day job to pursue my dream modeling career.) + +![Chris dons the ColdFusion on Wheels t-shirt with STYLE](https://cfwheels.org/blog/wp-content/uploads/2010/07/cfunited-tshirt-chris.jpg) diff --git a/web/content/blog/posts/two-new-repositories-published.md b/web/content/blog/posts/two-new-repositories-published.md new file mode 100644 index 0000000000..e7ba15f4c4 --- /dev/null +++ b/web/content/blog/posts/two-new-repositories-published.md @@ -0,0 +1,26 @@ +--- +title: Two New Repositories Published +slug: two-new-repositories-published +publishedAt: '2022-06-07T17:47:42.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - Community + - Documentation + - Plugin + - Website +excerpt: >- + We have published two new repositories named + cfwheels/cfwheels-www(https://github.com/cfwheels/cfwheels-www) and + cfwheels/cfwheels-api(https://github.com/cfwheels/cfwheels-api) which handle + the CFW... +coverImage: null +legacyId: '120' +--- + +We have published two new repositories named `[cfwheels/cfwheels-www](https://github.com/cfwheels/cfwheels-www)` and `[cfwheels/cfwheels-api](https://github.com/cfwheels/cfwheels-api)` which handle the **_CFWheels.org_** landing page site and the **_api.cfwheels.org_** API documentation site respectively. + +The `cfwheels-api` repository is a good example of how you can structure your own projects and keep sensitive information and the core framework files out of your project's source control repository. The project used a `.gitignore` file that keeps these files out of the repo. It also uses a `box.json` file to specify some dependencies to pull the required files back in. + +Using dependencies in a `box.json` file is nothing new but what's interesting is that `cfwheels/cfwheels-api` has three dependencies defined. One is the core framework itself and pulls in the latest framework folder. The second is the newly published `CFWheels DotEnvSettings Plugin` which allows keeping sensitive information out of the repository by using a locally defined `.env` file. The last dependency is probably the most interesting, cause that one pulls in the `Semantic Version` module from ForgeBox which is a module that wasn't specifically written for CFWheels but can be pulled in and used none the less. This opens up the potential of using many more modules from ForgeBox instead of being confined to just CFWheels Plugins. diff --git a/web/content/blog/posts/unit-testing-your-new-2-x-app-in-2-x-beta.md b/web/content/blog/posts/unit-testing-your-new-2-x-app-in-2-x-beta.md new file mode 100644 index 0000000000..82a761c14e --- /dev/null +++ b/web/content/blog/posts/unit-testing-your-new-2-x-app-in-2-x-beta.md @@ -0,0 +1,31 @@ +--- +title: Unit Testing your new 2.x app in 2.x beta +slug: unit-testing-your-new-2-x-app-in-2-x-beta +publishedAt: '2017-05-30T14:45:39.000Z' +updatedAt: '2025-06-02T13:36:01.000Z' +author: Tom King +tags: + - 2-0 + - testing +categories: [] +excerpt: >- + Hands up if you've ever found a bug in your application.. Upgrades, feature + enhancements and bug fixes are all part of the development lifecycle, but + quite often with deadlines, it's difficult to m... +coverImage: null +legacyId: '91' +--- + +Hands up if you've ever found a bug in your application.. Upgrades, feature enhancements and bug fixes are all part of the development lifecycle, but quite often with deadlines, it's difficult to manually test the entire functionality of your application with every change you make. What if there were an automated way of checking if that change you're making is going to break something? + +### Enter the CFWheels test framework! + +![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAIJCAYAAAA7wk9xAAAgAElEQVR4nOx9ebSsVXXn76vhTu/dN88TIDPIM4gCBhENgkrUmGivpI22xiErHaNtkjaOndaAorHTrRDjHDUtptHWFZxAFBUfKGALymiYnryJNw93Hqrq6z/qffXOPXdP53xf1a2nd691V1WdYe/f3mfvffY5VbcqSdM0RYcpTVMkScL2ZcSNCeUZShZeofJi8cXK4ebF4NDWqyi7x/Jshz91moq2o7T+QPfaQsLXDl+LoU7GQ9Gy2sEPKNafisxdeebFUDv2oU7tbZ3E3i2+VjR10nc7aY8YvTR8ITbRxrbLvkXl1077btHYO7WndQNZchdQ3PmkW3xXk1P0macof7PkGam/3fisGItcL0mWS6VsQjYp9j6Amue2uTIkYEmStP4k/v7r2ADyn1v1zwKCw+PLyfBZ57hypLE+Py1QNbtyPLmxFru7a2+hUIyS3IyXtF4ZPs3HpDXIe4+WJ/gpvTgbarGVJyZCcHIyJHxWX8seY3BrtnBxaPFg8VspH7jxTBFlJy1PaLlXwsrNkYokDRc1JtPZX0sOXx6dNUyWfm1v0/YG7rmbu6x4NZuE5HKr/r5sC09tP+R4+fO4eNJsbt0/LP1UbvBJKvx8PKG1EjUvdO20sdx6cf6e9Wn4pXxtsUPM3uBj5HwoJB4kv87aY/NkyD5mzTWUTAm7Va4Wlxy/omsM697AxTDn21m/77uSrGyOtc+an0JqA4qstRK3D0m5V6tdfH7WnEfpIOUZLUdxukg4tDpEqxs1nlZ+Ei/rWlU4Jv4CusnBDxApgXLJxe+jFp8qgqQF9R1Oeq3d7GnPNR7+eNdRqQXVbErZROJhtYcVA7XGmhwrTgqPZCfOLhQPv59rp+wjyeX8ldNP2lwt8cLh8+VJccbh1Ozi9mtYpXaqj9pIKftpG4rk65RulJ0o3aXY4vrdds6XOXya33IYqLXn7CP5rDueso81v/q6crgoonKHttdQr7UCRCLfnpr9KCw+LslHfL6Sf0m5k+LrjtFiVtLP5yXxo/SS9OXkSXmJi29qvranUOvD2VziF5L7XVumKX8Qs8SZlk8p+VbfkuZachenA2cHnyz2tMSGxV99v/Z5SPxDciVnA19v6rkln3JrwvHi5Fn3TWmvlmyn9Yfuu5yePk8Or1Y3UHaj7Cv5q3VfssjX6hjOFymslDzLXuCTz0/zXXc9pD2Lk+XyC903ORtJGKTY4nTkZFlyBZePqbUJibs0TZGk1lWdp3map3map3map3map3map3map3map+OWSlyHdOMrjecereP82xntJjpGJjc/pN3lqb2OeeQwWHXz8fjPKayc/todUahv+H3UTW3oWob6pS+fs5fEm5OltYdg4vxJ463JyhuvlDwqBiz+FYo9tl8iLteE5iMLRikONP+z5D9JNoXF2i/NoWSG2EvLEdL80Ni3+j4nU+IvxQBnT2o8R7H+577Wcp1l7Tg+Eu6QeJV8zx/DyZPaYx5DcoElTotYSw5jqP1CMVnj1OrfVH/e3CHJ0kiLAc1+lhiSsFhsUJS9tEcrdsk2kh9aeGvt3DhrbPi88+QWCYPGnxsr9UtYQvKgJlPj3S7/02LLmpNC2kNzjYtLem15LGq8pisA+hMAaZr/CwlcHlZ+GRTuI0vcR22sr2MoFLuPk7JDO3BymLiPJFpkdtp+VjzcWKpd4mvpo3yPwhFjK4k3h5OLhVC5oWtvkSv5esiaxWKWxuX15U7h9Pti9Qntj/ErKUZicYWO48bnzbXW2IzFl5dCY1jKK3nyWFH5yOVRdKyGrqU15vKOs8oOyb2W/aMdtQaHh+sD9I+pWzBb6quiqci6KG/8WHxbi3PJ1hK+mBzb7lo3VH5obOTddzWy5OSi81Meiq0zAP6j7jF1tLXuL7puksZosV1knRfiEy6mjv4LQIxx2x1wIdSpQ8RcU7uK9KLlt2v+rysVUax3io7nNYwt4q28ihibV74lVxe1mc8FFVEMdit1O+6iDqzdrGc7YmWubNWuXNApKvJAf7xSN+W7bqr5i5Z5PPjJXNccc0nd4uOdoiRtkvk2MCRJ5L1ljzmI5i0eirwtbxeWvHbhxsTIt/pL3tvIGPkW6uRtaMj8InXJ6ztF8sqba2LWvkjfOR5yTd75c+EvReaaGPkhWNI0xe53vhMj3/kOy6O6YQPWf+ITqKxb1zVrzPEq8gDUrjwfMyeEF4Xfqstcy9d4hsi3UDv2plj5ReXgNJU/lZBnjS15L0Q+xzuPv2jyYtapSIxafLQzv3RaPrfnxMi37rlW+Ra9rPItvIqqP/z4yoslND4l+TF1kQWvBb/5EwBFLATQ3ncfQ50w1DmLLJS6ActcUow/HO8656G8/lGU7wLhScyCL3Z8kRtPXiwxeEJ4UWNj9YyxP2D75uoi8XQqL4bES2NsDI9s3oypxx5j+ZVXrMD6T3wCi1/+8qiN2+/LyLr+c5Uri9rni6wXirJF6DrmlWst5kIxFjGnCF5FxHaeg2leardfdcJvj4eaqij8ndC1XftqDO/QeZ2sJdqBp91nik6cYTM5Re4bUnvJP/9nr9126o7AHZf9uX1+v7txUeOsikmyso2A0oHCxemn6a5hDOVPbfT+o9/G2ZOTI43lbMrhoPhIa6nZ0Gpj9yZNeuQwafbx+zR7+X/UPEpeyDpJ+Dis0lirDKrf91Fr/Fp4UePdRze23fFuHFDtPl4LRm49Nb/385zFNpbLUi2/WeLUx2/JlT5OCas1J8T4OkWcfal15+RQ/uXy4eZO3HsvpnfsEPE1hocxduedSKemZvH2efr5nxrjtnH+JpGUB63zfPnua6u/c3hC/c2CNWvzc4e2L4QS5zdUvxZzXDz5PkLJydpDcXM5S8s1lD1D6jzrIcDPf247Zwct7q15j9LFxc/lXMnHtL1Katd8xG3n4lTiSfHS1jLUhj5GSSdg9l6lyeTWVvI3C2YJOxWjeUnzE4vvWR8p/pQcH5ufXzU9uPEUZi62JbJconPytLwg5clQkuLIz6FcjEgxbeELABXu4OlvNu4Yd3Om5nNztT4/oVOL6SddST736PNxb5ClpGG5aabGWO2h4dfmS33ua0oHS5+mt0++r2jyuHV3x7iPfjsVCKGYXXlugpPsLPHksPt91Hj3tWXdKXuE2F/Sw2/XfM21obYpUryoGLfYPUQfzt84Xlo8hq6RpAunt5aXY9p9mZxfWnSR8Plt7mspf1ieW+NGki3ZzX09evvtSOt1li8ApJOTmLjvPkzv2YOejRtJnj4OTnduTwzJQyHyKJxcoaj5sj83m6PlJw6b5sMc1ph9QJPt6kLxk9Za26u4nGi1tx/PvmxtT5HwhOZ0bY/j8HOYuBqNquEou1lyNpdXuNys7TmhMcNRCBYtt1pw+3Is2CWeVntyzy37uyXmMwqxA4XZGpMxRPk6h8Nvp55TY7S9gJOj5Q4LHs6vQv0tFAM31qKfNs/qD9Jeq8mU9mZpPIWv9QkAruijbkSotkwQtUlywHyeXL97EPOTPHUD4rdxelC8KZySDpJMTjbXlvHP+v1xXLsvk3vt6+DL9J+HYLeuh6+DlOQs60GNlfzDt58FU6g9XLL4krvm7nNfv9C1oHTjbODryunDkRTLnH9YbOjbwxJDlB0ocvMVhZeKRSkeJd9y7WJZN59i18LHIelGxY3FR7RYyUgr+n2e1AbnY/f3BA4LZ3cNs4+9MT6OsZ/8BFAuAABg6rHHMPXII7N0kfxIw8ON9Z9rfZx+PmXz3FjRYpHD79uA0knKYxQmThcObwh2Xx6lj2XdqNdScautmyTT6gMhfug+D9mLLRj851ys+nmKsoVVloWoOlbKnf44Cl+oH1p04fYv6bmfjygc1twTqpsv38ceQu5aULItPq7pxsWyFbOUBzLi/J3CR2Gl+rk2rrb18fj93F7s47GuAbdvS/wlG1pJy02aDppuUu7iMITgpfqtNTIVLx39FYDjnUICvxPUbXjaTZS+1ra5pm7ElId+HfThdGiXbr8ONvt1pTRNkQCAsj7j996L7X/0R5h86CGVZ9LXh9VXXYUVb34zkp6eYoB6dDz51G96XB0vOH8dKTTXt2Ot5tffRqF26oRdi5Axv/7HD/2mrFUJkG/GNJLGS7ct/mttbChxt2jaeGmM5hB5b6c03kW05+Fv4RmjP3X7R5H28RupLRZTaB83TvqkQ14qgm/o2mr6WG4uQ8kiL4Qv9Y5kTOLnbq05eTFURH602ojqL9J3LboUvdbSnLRex8j3voeJe+9FWqvR8+p1TD3xBIZvuAG1PXuabT4f//XEBEZvuQXj99wz418GfAyN0VGM/PCHmN6zp205YgYu4Z0Cbqz7Osb+/vyYHMqR9I6wlUcen7IS95HNUHnt8JHYXD6X7x+F5vqQnCy942nF5o/P8063JD82fxbZR43l9kXNpqF2otaWs5nFVhQ+7pJIk2ehPLmw3fEX4w+hfmqNMWrfCsFmkZ+R9El2C+VZl5j9KuT8NqOObzQaaVE3HVzxnLXHFNdWGTF4ipKnjZGSSCifGB5uWxFrEIqpKB4x9vHbKFuE2sfqz0XolddXY3WL7S+al3UMQP+vWkjusayDVacickJRsRorS4qdGIwh/lBUTtDGN6amcOT667H3yitRWbsWy97wBix62ctQHhzMJmBq2zYMfe1rGL75ZozffTfq+/YBxg0+GRhA3+bNGHzRi7DopS9F31lnHfs0QJpi8pFHcPDTn8bQN76BwRe9CCv/+q9R3bAhd+xY9xwLr05Rnrxq8VWNR+zYWPuFYi6KT7fmnnbYOW/O4uYVtZ9YMIbugXmpCJvNdc1L9XWq/mlXviiSVyfndXtu7mSO6HRu1sa2LgCoItpXhup32/x+F0Defn9sUcmzm3iF6M3JB8JtzM33x+bt57BQNijCH6z9kj2PF3+I4WWxcQgWjZeEO28uscx3dcmDtcg1COnnaC58K68/hPb7Y4voT8fHcejzn8e+D30I09u2AUmC8vLlGLziCqx5//vRmJjA4X/5Fwx9/euYevxxNIaHTetBUTIwgOqGDVj4vOdh6eteh76zz8bwjTdi3//8n5i45x6kExNIBgaw+BWvwJoPfACVdetamEPXkKLjdZ8r0vdc+VR/p3zPgtWqS5F2K3INi+TVyVzE2dWd7/PqBn+IsbGFl3WNLGOt/dxYrV+TFTK/23MRN9/Ki7JB0b411/7SDl6dzEUh/sCtsY9r1pw0axFIM1Te8RIPn5eVtxZ4VgwZhc73DR6KhQvWWAwUHwuWGNsVYfsiMOT1Hyv+vJtYUXOo+bH6Uzxi8gBQjA/7z0Pn5pEPxPvyXPk/NS/Gl/Pgz7v+ef3P5eFTbc8e7P/oR3Hg2mvRGBmZ1V9esQKo1VA7fBj5Vm82JT096DnjDEw9/DDSiYlZ/QPPehbWf/az6D3tNKBUKix+YufG7iNS4Rmah4vAHyqjSP/Lu4+G8OKK0YyXND9v/Ft8JAa/1G7BUlQODZmTp+7KxgHyJWBeLCFzY+0fsw8UUVN1Qw1VBJbYfbQTtWu7cmcRdVdGsfJjfZfikef8mQc/9zoj9gIgZJOIAVJEYUzJAvItlnWcdXMJ3YSKKHgsfUUfzoocm2dOCI+QtWxnEo7h0YkC2kKxRX7e4sgd78uN5dfpWAWK+cgmxz9vIa7xLMpGljjUDjWcLGp8bc8e7Lv6ahz89KeRjo8fGwsUftjniJLltg08+9lY/b73YeDZz0bJ+wJBTs+MYtckdD3zFFWWojEUb1EFvxV7LM4YXAD/zl2IDhQfba5VfjtzWmyuyZvj8lJRdXQ7yHLIKcKmIVgkjEXGeiifEPmxdUSor7Qr3kJlxeAPxd6u9Z7rGOSoU7hKvlBNuGWDkcZyjuXO1Z4zdxazCr0Qfm4ilHTKZGTjpWDRDkfceLdd0oV6zRG1Di4295GSK8mS1oUq0qX5rmxpjobVglMq6Lh1p/hpbRoeqZ2LN8pP/HnaQYFq1/Bz2DJ/4vhx9qTWhMNKxQxnB6nff+5jyp5reUOLVamdk8Hh0/Kkxtttl+RT+Lk+S77l+LmvOf92x0p5130t+VmSJJh+4gnsfe97cfCTn5xx+A8le5TbxvoXAmM/+QmefNvbMPz1r6MxMSH6tNum5cxsjGU9uTGWfYnqiy1oqH3Kb+fwa3uHBR+1L/vjpVjlbMbJkni45Pu/30bpwO1j1N4n6cnFm8vPz8VcrqP6KB24NgqPtKZSzrXWkBp2H5M172n8pH7qtQU/wNflnE6aPIm4vZTCKMW+hkHyI4oPN9a617hjQzBZz1OufHdeSF6R+EqyuD7XNpQt/TEZSbnIf+RixZInND+3nkso8vObpoffJ83Jc/incgInM+hnAPMCO9745aVu12+eX3fxy0vtxNPttvtN45eXul2/dvBrjI5i71VX4cA11+Q6/JP8IX96wNo/4zFJ0P+MZ2Djddeh99RTw/AUaL/jYW3n+XUPv7zU7fr9pvHrFO8Y6nbbzfPrLn55qdv1C+VHfgIge67dnvhzqD6Jp/YupibLepNlwRdzkynxC20LkWEdo906Sfa3yvHXk9NXwknx8vFZ5HM+FIJJGkPhk2Rp9tfaYjBbeYW2+zfgmq9YbGfB4fdxaxyaRDUfib1dl9pi8LmPIblR6w+5fffnc1iKzL2Uv3E4rbLLCxdi4IILUFmxYjYe5jn1murzrenPSYg2aX4CIKlWseC5z0Vl1apj44V4de1U5DsI1DvNlGyOT968HJpLrLw5PwqxnRQf0lpY49qKT4oPLl9nbXlzJ9durSVi9gbJD0P2JWufNEfKUUWQFnMxsS/FZFFE2cTqExwfzt5FYczb5lPIJ1D8Pvc1Fauh+lvtpu213NgY0vYObe+JwZMn9+ahEL+1xIlUN3Hj/DkzLgDcAw33EQ2LQK5P4hkjK4S/S5SORXysKePnBqvbFouTarcUXa4M7rDqY+I+zuPKdcm3G6UbZ1sfXyhxsqxtFv4hY3z9Nf20thDMVCGnrb/EU2vXfCXU3tYDtx9TUkINSd6Uj1iTL2VbKuYl4uIqNkZCi2rXfzTZlhiz2F7yH58vhSXENln/wksvxeALXwiUyzP7mefZa84TsrHUgZ8by7Wl3uvec87B4v/wH1BevJiR7vBxbBJTrHG+6sYYt29Re5zPx41vP4f4e5YWSxa9LDnfmpMlWZwvanu8xfcpTNy+zNnXxUPJdvMoR1ou4dqttZU1di1tsXt9DPk1HidHqrsstSaVu/39131t5Umti7ZPWG3p18P+3BBbcbpKe7Y1B1r2FndcTB1P6aPJp/AU4deavKzNXTPJpn7+sNRQXH739xp/PJf7fF5UP1WvaeunrRWnH4fR9VlLPUrV9P4YC0nrXZIGUxR6CxPipFbjWORLPGI2HEmWPyc0WLkNQdvkqITPJXaKX2gCsSarWNuHbGAZUfpxCcuSQCTS5vvJ0LoZSQWCRJY4i41Fiaybt4X8WLUm/qxdSuIWX6XwaGOyPkusSsRd1rn9mg04WTHjY4pz7XDvPpdi1ULWQlriWV60CMvf8hZU1641ywWcg3mlgtLgIEoLF864RCgislwepYULsfjlL0ffOecAoN8ByojLcyHFu7RnUHuNVFhJvLWCUxrjP7fGBkch860FbsjlS546h8sN3Dr6fX570fuyxisPafsqN0crqC0ygdmHxFCft/h7O+pXCadlD7Xi8+dRB0qt5vV927rWIfrE+LMFT8zaxfLLW79a5/l7gPUiRMv31LnJX6PQQ7ClhrPYIu95RhoTOi/mTGChJG3SDGWLOihQRN3uxMjjMBeFXyq2iubvPwdQqD4S/6J4cmtatL3aZX+AtnlR9s/4t9t/tL4iZRUVy74soNi14Na6XbnO9dVMlo8jhp/0PA//WHlF8AOKtY/7mj20NRrY+973Yu+VV9oEVKtYcNFFGPzd30Xf2WejvHw50GigtncvJh58ECO33IKx225DOjkJCBtwafFiDFxwAQae9SxU1q7F1GOP4dAXvoD63r2zxvafdx5O+Ld/Q2X9etUm9ZERjG3ZAlSrSKpV9Jx4IqqbNrE2n3rsMdR27QKSBJV169Bzwgmty4wZRd70NKZ/9StM79wJ1OvH/l0hSZp6ViroOekkVDdsQOJ9oiLjkY1vx75D6eY/T6enMXb33WgMDzcvWJIE1Q0b0HPqqUhKs97/EPEXXbdY8OehTtRF7c4VwK9Prnb558VrkXe81nhF8exkjV0kH4rfr4P9gfbV2BKfduSOTuIviijMFcD+Lo+2mFrhRbXNKs4II1CHP3cM95zjZ+mj+HA6WbD7zyU7SfpIeDj5FG9qzXwbS07ujvXHWJ2YSmocxhh7UDIo/BLfkPW22ssyX8LO6ZI912xg5UuNk3zTkny1JC2NteQpLtZcHmka/26QZR5XsHI+4PZTcqRYC8FlmRezsWm5SMvVmm6cDG4sl1vdsfVDh5ptoN+9TwGUBgaw4DnPwYq3vhULL7sMIGJr0UtfilXveAfG7rwT+z78YYzcfDMaw8Oz+C689FKsfv/70f/MZyIplZCmKcZ+/GMMf+tbMy4AsnmN8XE0JiZI/H5enHr8cTzy4hej1GgAAMqDgzhlyxb0P+1ps+ycjo9j55vehKGbbwYALP7938eGf/onVNesmWmjeh2Hr78eu/7yL1E7cICwUJN6Tz0VJ91wA3rPOMO8R1Pr4bf7c7i9xY8Nf1x9ZATb//RPMXHvva05pf5+nPz972PBhReKmLQ9OsZPpVwdG9tajcHtyTE5hNPbIs+Xnc3x5VM8YnK1haRc7ePyn1P9lD9K/Dg+3DjrfuzipeZZZHNypD6NQmpuyxwrP2n9Qnlb/D8kN0gk5T2337Jv+7WGFG8SHw6jVK9l/VKu5vha5XP6x+YOab2kXM3JteQOCYtkJx+Txi+zfylbFF+I204ZlzKw+6iB9Z/7vLg2ag5H2lg3QUvjqYRulRXqiFzS8J9LxRCFW5PjryHFR+Nh0ccnSSd/A7WsDydf8jXOjm5cWHyV2/D94kDSwX9t8StN/9BiwNcnxu+5pMTN5RKjFMPu+vg8pA0wdkPgcFrGSfykDV567euvkTXfWjFkPC34JbLM5QoU6jk3PqPajh0YuuEG8vCfcSkNDGDZ61+P9R//OAYvvxxJqST61MAFF2DdNddgyatfjWRgYMb3BvSedhrWXnMN+s8/v/WuM8nLwTO9cydGvvtdpEcP9e4cys9LAMpH/zA8jOFvf5vUfepXv8L01q2t8dO//CUaR47Msl99eLj5qYYDB1p83b9sfn3bNtR27iSxhe71boHIjaV4UvZo9Xm2KQMo1euYfPBBEpefc0JzBZVvKT4h+UnLOVLes+4hHCZfrlZcW2s1qp6yFsKWfBdSJ1rta62DpFqZk2c97FjJwtOv8X2MEk6NL/WcksONl2Ja48eN9cdrviTtd9IcSbari+V8otmLqi05fNZawyqbwsCN8XlyPhJaZ/pyQ+PIkqOk8VQd7mOixrptFp01n9Nyjo8pG1dyB/tBZ0l2oaQV6drc0MJSG+8HjpZktODSiEu6lkOm5fARY1OtXQvsENICiMJh1cmf7weQ1E/J9TFogUod4iW+frtWDIUeNkMLJco+1qLMn28t7jj5Fv0tBStH2kZkfW0teEPxadgA+4UHN4caH1rYhRRUFnwhFJsbhm64AbXdu2d9AR9w7AC+9FWvwsp3vQs9J54IZL5Sr2N6926M33MPxu++G9NPPgnU6y0elbVrsfzP/gy9J598jFeSYMlrX4ve009vYa0dOIDhm27C6JYtaAwPH9PHwdMYHsbo97+P2r59ov5A8x3/vlNPbeEEgImf/xxprTZr/OSDD6IxNNSSNbVtG6a2b58Vb43hYUw98sgx21Sr6DnlFAxcfDGqJ5107MsPG41ZcoDZvmSJVYs/W3m2+ioVDDzzmeg57TSXEdLpaZaHNa9Yaou87daLkxgcFFE5ztXXUguE5DWLzv742DrI3aekAwjH31oH+QcRTh/KrpQ8jr9E1two1TUcxdZRljHaAdqXR4217MvuQcmqfzZH8p8MZ0hdm3cftOYjCY91fOh6ho7h8rul/g49H0o4JBlan3+mjMWQ96wtyct4sz8DGEMhiT+mvwiSNouQAphrsxyoKHmWZKQdgKj+0I26nWtEFXBScrHqyyXb0AJNs58m33oBZMVnoZD1oPBz6yEVQu5z15/9ddD8z0/YlvXiLht8XKGxTI2PeU3ho+Zw+Hz8lvW1biAaPkvRwuHVsMQU6RJZc4Pvp7Xdu3Hka19rHQApKX3nnotV733vjI/FT23dit1vext+dfnleOL3fg9PvOxl2Hr55XjyrW/F5COPtNar98wz0Xv22a3DeHnFCiy85BLg6Dv/k489hh2vex12/MmfYN+HPoTpXbtm4s4eGw2M33MPJu69V7VJdcMGbPzsZ9G3eXNr/uTDD6PufXQ/rdcx8cADqA8NIT0qKx0dxcTPfz7Ldo2hIUw99ljrUwn9v/Vb2PTVr2LTv/4rVr3rXS2s2SWHb/eQg52/D3LzNN+i7FNasABrPvABrPnAB1BSfk3BerAJPYDnGWfJYUUeJKicEXNJIlHsxYl1PSx8Q4p0374aPm1f0+oFbT2lg45W34bg8OdkcjV7hNbQfl+If0i+KdWHIXUHxZ+aH+qfoQf3bA5nb+ueaa1Xtfo6lGL8z8Iv1H4xfZKMkPzY7jN2qC1n/QygK8RiLGqzilHS5xfCQzrIUoUgNyYkkGOSX8yBIRSfRSep0AlNrnkOoBq/0MRJbU4hFwwS5jSd/ZNzXGKUEpN0UPEPfJa1lHTy/cGyQUg2z/hJhbzPR7O55EfSGobkGmnTD90MJR0yPpQduc2PW2P3MeQygJOn4aPGUfj8/tBLCu2QZeEbIm9GDDQaGL75Zkwc/fg3gNY72dljadEirHznO1FZvbo5p17H2G23Yeull8/nAXwAACAASURBVGL///pfmLjvPkxv346p7dsxef/9OPCxj2H7K1+Jxuho066VCsqDgy3+lVWrUFqypIV7+Otfx+gPfoDa7t1oHD7c+gRB6uDIDtZTW7di5DvfaX1KwI2/GbFWraL3jDPQd+65Lbn1Awcw+fDDM2xS278fE7/4BdLxcSSOrNEtW2at8+Qvf4npXbtadhl49rPRv3kzquvXo3L0YsT1oBauiQnU9u1Dbe9e1IeHkWb6pbPflXNf10dGjs07cqT5yQKlAE3TFI2JCdQPHkRtzx40Dh9GOj09Mx5LJZRXrkRlzRok1SpEajRQHx5Gbe9e1PbuRWNoCGmtZvJDy5iYgyrHj8oJefZmn5+0D2m5WstZHJ+QXCPlEU1/Kedb6iWOKHwx+vtYqDk+PjdWOL6UvtRYS43jy7LUBBZ+HFnqGEqWpeaxyLSMkXTzc7YVg4Ws+lrWX8Kn1Yca35j8JOVPSw3I+Z9UW3JzNXwW0tZI4yflBIkftz4VSQhlEKowpeZbikxKJgVSSwxSIrcke9cpskMktZFph2OLThxm7eKAsr00z3IRYVlnKw9OZh4/sMy1rr8mixvr+gQlk+q36kslH+6Q6q8/hZGikINazFpqOlAyKF1i19DHZfVLiRc1h+KnFZhSm+83IX7q87DkE8l/JKLm+HJD+Ep7AxVXEiZtnDMI9eFhTO/YgeFvf3vWO+MuDVx0EQac/9WffOgh7H7nOzG1deuM/9F3JU7cfz/q+/ejvGDBMf/p68PAs56FBRddhPLSpU29Gw1UN23Cole8AqjVMHHffa13311+rUuARgMj3/9+8+cAf+u3kPT1sQVAaWAAPSef3MTdaKAxOorJRx7Bgosvbo2p7dqF6e3bZ9oSR/9dYHy8+d0FR9dn4r77gOyj/UmCgfPPPyYzTWd9f0I6MYHxu+7CyJYtmH70UaT1Oipr1mDg/POx8LLLUD56CdKSmyRAmmJ6926M/eQnGLvjDtT27AHqdZSXL2/+WsLFFzd/YYAo2hrDwxi7806M33VXc23GxlBavBi9Z5yBBc99busLEGeQcHCY3rYNo7feion77mviaDRQXr4cvaed1rz8eNrT1L0m4+XnCqtfhxAXR1JBy8m35E+uHuJyAKW32y/toSF1k7T/5rG9Zc+hxrn7rNVWmkzLfhmzf4TycfFkYzU8ndiHpDGafpJvaDaP3aMstQ9HFN88uSVkzw7hQ+Wn2HrBn8/h03zNWndyOvkUm8tD10s6g2o8OPtljzMuAKybA8Vc4+MCluZyvLlEbtnkNCOFjtfIXTAKY0iC0sZZnSJEP3+shs2lmIsSbpwFR8w6SfqH4s/jJ6EbiqUAzZPQJLJslBRx40NiMsRfJQrNAxrl2SCKiKWYAiJUpt+nybWsW9745XjNwDE1hfGf/xzj99yD6SeewNTWrZjeuROT998/4//2Z/Dq6cGC3/5tVFatAtD8Jv7DX/4yxu+5p9nPYEinp7Hvgx9EeelSpGmKsbvuQmnhQiz70z/Fohe/GElfXwvr4BVXYOGllyKdnsaBa6+d9fH7Fpajj5MPPogn3/Y29Jx+Ono2bkR10yb0nHACBi66CKWjfAEAvb3oPeUUlBYvRuPQITRGRzH1yCNIazUkleY2P719e/Mn/dD8pENSraJ+4ACmd+3C5GOPoe+pT23ZM9M5s0v/0U8XtNZ+BtgEhz77WRz4+Mcx+cgjwNF/r0CSoLJ2LZa+5jVYfdVVM352L200MP6zn+HANddg5JZbUHvyyRn6H165Eguf/3ys/Ju/Qd/mzTO+hLG2fz/2/t3fYfjGGzH1xBPA9HTrQiIZGED/5s1Y9Z73YPCKKwCDf2U2Hr/rLtQPHjzm5wCSBQvQd+65WH/NNS0bhMZ1Ef6uXTRbD1YaPo24AlrbF6jn1gsCiYc0njt4cxTyZkKIjfPm6ZgaRMrDsfVurB+H1utWjG6N7fKm5kr9GmZJPjXP7ytyf3axcPhC9bXs09RrjWLnW/FQY6XzZZ51yLP+mj5afFhr/1CsAPMJAG5iTKII6bPyDE2IseOlGyS/333djsKcoxhHL/KQk3f8XPCN9U/txjXvRlvkulmoE5tCSKHM9ReVT7rJvhrlvbQs8iIuhEeewqfIoml61y786uUvRzo8jHRiAunUVNMmwpzy8uXoPfPM1oF9ets2jN1+O9KxMfbnAgEA9ToOfe5zrZdprYbyihUo9fcjGRg4Ni5Jmu/i9/UhnZxsyeEoBYDJSYzdfjvG7rgDSU8Pkt5eoK8PJ1x3HRb+zu/M4F3duBHVdeswcegQMDmJyUcfRf3wYVRWrEA6NYXJX/6y9aWCvWecgfLgIEZuuQWo1TD+05+i/5xzmnInJ2f8bF71hBPQ85SnzMKWAEh6ezH8rW/h0Be+gMaRI54CKaZ37cKBf/xHLLjkEgy+4AVHm1NMPvAAnvzLv8TYnXc2P2mQJMDRiwrUaqjv24cj//f/on74MDZ8+tOorl/fNPWhQ3jyr/4KR778ZaSTk83xlUrTX+p1pGNjGLvjDux+5zuR9PVhgWsjgupDQ9j9rndh5Kabmp8QSJLmhUnGb3QUY7ffjr3vfz82XncdSr29Hd3fM7LmrnZgyruvhRys/T4rhfK38jgeSdujiz7Y5R0v1dCWd7mL0Devjbqp5i/q/BPCo0jKW5eGnNny4rGMLaLubNeZjfwOgIz8j31YGPtzstfUR0i0sVw/x4/ib5kjyZHmhdwISbwsOC36UqTNo2RLr614NX7uGnPrHuofnHyrLlYcGWmJhXodu45FkTUOXawh9o6RXwRpGGN8xqI/5c+WuRoO66ZB3fb7ryWbSP7A6SbND9Uzdiw3t/VYq6H+5JPN/yefnBQP/5nUyooVqK5f37RdmmJ6505MPfYYAOHwn/GYmmr9odFAOjWFifvvx8TddzcvEI7aanrrVoz+4AcYu+22Fm+OZsis15GOj6Nx+HDz+wNGR2eNr27ahJ4TT2zNq+3YgdrRLxlsHDmCceeXARZcfDH6L7ywedAFmhcdRz8ZMfXYY5jevr1ll4Hf/m0k1eqM9clkNMbHcfBTn0JjeBjlVavQd955GLjoIlQ3bGgeptH8RYFD//Ivrf+nT0dH8eR//a8Yu/12oFZDaXAQS171Kmz83Oew8YtfxOI//EMkPT3A9DRGbrwRB/7pn5qyJiaw/6MfxZGvfhWNyUkk/f1YcMklWPfRj+KEr3wFy9/85tb3E0zcdx8OXHstpnfsmLlOns1Gb70VYz/+cfPwX61i8IUvxIbPfQ4bv/QlLH75y5H09wNpisnt21E/eLDJI7AO0ci6z1FxKcVqaHy7/SF1QLsuVkPqEos9YuS6ryleReQsjZd1z7Y8ani0caH5PmQ/CKmhuH0vRq6EpygKWUOLfGtsWnJICGaLDlR8WGLHor/1oobjFZKL5mr9Y3JWiFyXxE8AUBcC1K2K28fxoOZxwS3N4eZSOKRbQw6j5VEiTsesPfT2UXJcVxb3vKjbP4lnyLuGeQ7FMeuh+QB3c5iR5PMcH3+uNo6jGQW3Mk/DJ/mfT9yYIm6BY/Sw6iaNs6yhhlHzH2m9Q/3AjfsQvWJik8pZVIGlyQqVr5FlvXy/njG+VEJy9FArccn6koEBlBYubOneGBpCfWioKUfh4Y9pHDmCve97H4a+8Q1s/MIX0HPqqUCjgcNf+hL2/8M/NA/DU1MKR53cHFFZsaL5Tn2lAtRqmN69G9NPPom+zZtRHxrC5AMPtPAteM5zUD9yBKWFC9EYHsbEgw+ifugQysuXY+IXvwAajWNfAPjMZzbtQ61FvY60Xkf/eedh+VveggXPfS7KixZh+MYbsefd78bU1q0AgKmHH0btwAFUV6/GyJYtzU8eAEClgqWvex3WXH116xMRCy+9FPUDBzDy3e8CAI58+ctY+fa3Y+qRRzD0jW8gHRtDUi5j4aWXYu2HP4yeoz+xuOB5z0NpYAD7P/IRpOPjGP/ZzzD5wAOtTw8As9dwetu21icJKitXYvlb34qFl10GAKiuW4favn2Y2rYNPSec0PpXCjcOrDWGu17WPVGqQ/z93ucVUu9Q+LScYtU3hCjZ3L6V93UIBp8HV99lrznb+DmV4x9zWHGxa5g5ssqXamyqdqVkhOhg4VHU+rsYivBvjpc1D3BkjV1/fKg/+DwtZzirXM2/YtbMIjeURxEU4rMxmLmY1XiUMiYWshR+oU7ry5cUoDY8SYaWcCn5eYlLgLHOxCUPn2eonaz9nO3aYTNrAFj1ouwfchNHHSxC9M6bQDL52qbKybL6n7SZuP1FrnkIFmtBoPlo6HqE6l/k5kH5nkWuS6F5nZPvjgndlEPGuhuZVRY7Jklm/M+5hZJSqXlpkCRAmjbfLTdcILTmuy/StPmJgImJ5mE686HJSTTGx9EYGSnkAsDNEaW+PvSecQZKCxYAAOr79zffya/Xm79c8PjjAJo/jdf/9KejumFD6x3z2p49mHrsMSRJMuP//0uLF6Nv82YRQ2lwEKuvvhpL/viP0bNpE8pLlmDhZZdhwSWXNHUG0BgbQ2NoCEhTDP3bv7Xs2nv66Vj2xje2vuAwSRKUly7F4j/6o9a/BExv347Jf/93TNx/f+unCSsrVmDJK1+JntNOa/lNedEiLPq930N52bLmvN27MfHgg62ffCTt19/f+onG+uHDGL7pJtT37UOSJOg7+2ysufpqbPjsZ7H63e+e8UWGsQcMKVZDfN+PTalOCKG8OScPUfu/NbcVtTeFHFT8eZrtrIcaLvcWPScjap/UdLDsrRZ9fZ+P9Su35gv1DU0Xtz/03VnJjjEkXapk6xLK23Keake8FynLOkeq/4vSsd11MnfhG1MHqt8B4DJxC2FLYEs3Ey65jhsz3hJkltsxDr81ifnjtQUJ4R9je4m/hSdlv1AMoeOL8BfK/hIeyh+sN54UfksiifUvC+Xxr4wkf2jn2vrjQ2zJ4S2Kv3VsJrudcWIZ72Ow5ILQdkv+Dck1VswUnlljiQsAaivMZqTT08cO5UmC0oIFKPX3N38Ozh1HzJf6ScwCjqw/8cb5Vpilb5Kg98wzUV68GI0jR5q/BPDoo2gcfTe8MTKCFEDvWWehsnYtGpOTqG7ahKlHHkFjaAiTDz2Evs2bMXHffS35PU95Cipr17L4E6D5xYbPe94Me5f6+1FZt+7YhEaj+b/9hw9j/J57WvMbR45g75VXAs5P9CVJguldu5qXKABQr2Py3/8dU48+2rxEwNEvaLzuOgzfeOOMmGuMjra+iyCt1ZoXIMJFS/8znoHykiXNfxUZG8PBT30KYz/+MZa94Q0YvOIK9J933rHvGEBY7giNVW5uLH9pft7Y7vR4f+/QdI3Za0LHF73Ph4z3MYce/Kx1qrVmkuZqY4qwjVbzSaTFNve8iDOCNJ6yvTYvT81nwRBSg7Yz9mLHW+ravLmAy6tZX15/CeUv5fmKP0Ar0EKDKiS5aLypQLAukmW87ygSHi4opcXxefvjfXlaAHLjrZhDgjpP8rfy1+zt8opZf4t/+Zitfk/ZlcNixU+tTxFrZfXrWP4+n6J9QcITQqFrK5GfgN3n0hr4tpFygI8lVG9rrrGMt47JWziG7jUz7EpcAGTcqI/0148caf1EYJIkqKxahcq6dajt2TPrZ/pEPCpiflyGKxHGtOYTtuk980yUV6zA9LZtQJpi6qGH0BgawugPf9jit/DSS4FSCdW1a9F7+ukYvfXW1r8BDGzbhqmtW1uXD/2bN8/6CT8f1+CLXoSkUpmRP1EqNf+PP0mQOO21AwdQP3iwNX96xw4cuf56Xsejj/X9+zG9Zw+QHvv3jOFvfUuwztELlNFR9lcfcFS/le94B/a8+93NXwAYHcX4nXdi5513orpxI5b8x/+Ixa96FfrOPnvGLxFY8qoW29Q8y36lFaiWApaL29DcK5GWU7S9I+TgE3uxEJtDKVkSbmtd68spErtkz7xrFYPNurYadm5sTA2n+ZFWk1H28MfE1Hyx9ZBl33b15fCFrL+FtMO29ZKHG5uNi7FbrL9Q5K+n9ayr+UveujAbU8mYUZP9xdHA+4vq8qRkUJsd9SgRV3j7sjkn1TYaSr4lGDTclE24QHTH+nz9SwsNj29XSyC67VKS4LBx432clmCjDlfcZYqEi/I1l6+kF8XDbePGurwo3FSfhaT45TByOlPPrcnfJUoepSO3DpwsLnY5zBxvP24kDNo6SbHA5QMtnqw+w9nJtxEng5orFbJ+XHG+z/kvN8ey11jsPkP3UmnGO+juoT9xXmeP9YMHMb1zJ9JGA0mphOqmTeg75xxM3Htv6wvy4M3Pnicefzj9FCXOmIRod/tSos8l19aVFSvQd9ZZmLj7bgDA1NatqO3Z0/wCQACl3l4MnH8+AKA0MIC+s85CacECNI4cwdTWrRi/557WFwwmlQp6zjyz9S8FrqwWpkoF5ZUrxf16xhrUakgbjdbr8rJlqKxeDShFS3nFihkf5U/6+lDdtKn1f/kkNRqobNhw7NcFMNPeGdalf/InSKencejzn8fk/fe3PjEwvX079v3932PkRz/C+o99DP1Pf3pUfvD7tHxhLQ6pHOb2S7y1/UuLbS4viH7A7Nc+lpi8LuVPzYZ+7aXlYj+/uvpb7eyOlXBK2Ck8nI208ZzOlj2aqiUsc6W4kTBIulDPtX2ashGHkWvz8UgxQtUxFBaLX3D+y8WSVgNQdpHmSHHk6+zbhdJRinHN9yz4qEd3LGcPyj4cfr9dyg2SDSw5Q9t7tLw56xMA7iCfpA3D5SMFgT+Wm8vN83FaxnKytPnaBiLNtwRySDslQ+KvbVT+WmpYuI0iVB/Kt7h51vWx+KokT/M563pwaxQaAy5+io+mTwhGCh/lu5bNV7O1ZHfJXy08NN24OVwfVdS4Y6iNQvNHizzOF62bhdQv4eH8wO+X1sLCv6i11PasFEDq/u48MOsAnXiP9cOHMXH//WiMjqI8OIjysmUYfOELMXLzzajt3j1bR1d+9jpJgGytPHwU8RbErMsKV9aMcW78VCroP+88HP7iFwEAtd27MXr77a1PMVQ3bmx+IeFRTL1nnYXyokWoHzmC6W3bMLplC9KxMQDNw3nvqaci6emZ7Z+O7KRcnr1ejI6l/n4kzsf9By68EMv/y39BeXCQtUPaaKCyZg1Gb721xa+6bh3WXHVV89cGhHnVdetQcn5u0cXSwtzbi2VvfCMGLrwQwzfdhCPXX4/JBx5ojRu/6y7sufpqrL/2WlTXrAnOSZaCPmQf8ceFFNlSjFvjS8qv1hxo6bfqYT1QUwUxZWOLXAm7hE/iIe3x3DjLHirJpdqkvUCyH8c71iekvZBa55D9iJOhUez6SM8tMix+p8nV+Go1QAg+KT4t+mixHouP8l+rP2syqHYLFoq08xvFn7ONlBtanwDwg8tyUOScR7t9in3OYZIuJSjD+tjz4JDkFKmLZN8Ym7r489rXn5c955zfag8/QELXKMQ/YteIo1hMkn1D5VlwZMS1h/LjeFC5whKLFD7OV4qwB5W7JHtQ7TG5KW9OcDFkPKhHjofFvnnydkyuDrGv315ZsQKr3vEOjHz3u5jeurX58fFarfnFfs470DOoXsfoli2o7dyJ0umnA6USBl/yEoz9+Mc48MlPAsKXyZX6+jB4xRVIkqT5TfXe/50nSWL6bgCSqlWUqlVUli5F9SlPQc8ZZ6DPeTfat8fABRc0//2h0UB9eBjDX/86cPTn//qe+lSUly9vzes980xUVq7E9PbtrW/Ebxy9AKiuX4/qxo2tL1O07K3aelZWrkR1wwZMPfwwAKD25JPoPeUUVE86idQFaQokCdKJCVTXrQPKZaBeR2NionnZceGFbN62UlqvI6lW0f+MZ6Dv7LOx9NWvxuHrr8fBT34S07/6FdJGA6M/+AGGb7wRS1/72uDaoIjcpOVZKyaLbC73SpgsezWX77ncRNksT27y9bHuhRa/l+ZxtuHmSXKkXE2NdXWSbNPJXG3FwdlG25Nj/T6vbSxjLJg4e7rzONvE2MO1a566o8h1tuYmyjYh/qvFUYiORfmbxEPiTeVRDVPJHegzk4zuCvKJClYugKXn0mZq4UGRRS/XSFS7y0OSIz3ncOR5rhUf7jr7WF0Hs8pz22JsY/E36jkXLJROVl1i18gnrkDR5Gm+ntffQse2wzYWHlxC5ooAyv9jdPHbpKKDwifZw7K5aJhC7NGu3BTCQ9JFe87JC+FXXrQIq97xDjzllltw6v3349R77sHGf/3X5jfTZzY8+ufS+E9/iiM33ADU60iSBOWFC7Hmgx/E0te8BuUVK1pzs/moVlE94QSs/Ju/wYZ//meseu970XfuubPwU/ukdkxNAZRXrcKaD3wAp9xxB0594AE85Yc/xMZPfQo969ez9uh96lObH6sHkE5MYHTLlqNGKaPv3HNRXrKk5T/VNWvQ9/SnAwBq+/Zh8sEHWz+L13PSSejZtIm0L0Vaf4rmvx0MXn55q23snntw8NOfbv6vvsMjbTRQ378fI9/7HuoHD6LU34/+Zz6zeQmA5icbDn3hC5h69NHWvxS05k5MYOz222e8iz8bzLGL86EbbsDh665DY3QUpYEB9Jx4Ila9/e1Y//GPo+ekkwAAjYMHMfXww0GxE2qnomPHkmc1Hm7e6WRusvDIs49JbZZ5/ljLXmLdMyQ50vMYe1AHyxAemX7+vIxf6N7q8+D6qfE+liJ8hTpgabWB9NyCidNPiyOrbO4AH6pLiGwNU6g8X7Ylf3FzNR7SPJ+H1G/hEcovZi9x81ElJMgkQTHzrYvDvab45dUjRF4R8vNgzuYDxxK4xs9qa0kelTykALTItNxk+vOoAx+1weWxbyhZNjwu2YZi5Q68br+GJ+RmV8Ih8bDOdYlac/9CxecRYkPOdlIxq922ajpRmH0d844NIa1w90nyZ8n2Un/I5Yikh4i7vx+9p52GnpNPRm3PHkz8/OeoHTo066P1AIB6HYc+9SkMvuhF6DvnHCRJ89cA1n74wxi44AKMfP/7mH7iCaTT0ygvX46+M8/Ewssvx8LnP7/5//CLF2PZG9+InT/7Wetd90w//2P8ieH1guc8B0te9apZHz2XdC4PDqJv82YMP/lkU8eJiWb7smXoO/NMJL29M+YOXHABDn3mM0C93vqug6S3F72nnILy0qWsXX2SMNWHhjBy881Ip6Yw+JKXYP8116C2axcSAAc+9jEkfX0YvPxyVNavR1qrYfLBBzH8zW9i6Fvfwuq//Vsse+Mb0X/uueg///zmLwTU6xj57nex973vxZI//mP0nnUWAGB6506MbtmCQ5/5DBa+4AVYfeWVs3RIGw2M/7//h9Ef/QjJwAD2ffCDzU9AbN+ORS97GXpOOQVJqYTG+PixSb29KAn/pqDpz42zxrwlVslLJiZWQ3FyMilMeWqJdpJ/mWG9BOF4WffK0L1B409dylDzXfkWbFqNwvEOrSkluxXhO7FnEes8y14XIpOLbcvemLfujuUTW+NY57rjQtfGf869YRjqJyG5kBvnn13aUQ/5JF2mzvoGnSIOeFbjSgkuJklaC9l2bTwW+dKmE2NLi/7WAj0UL9cWk9Bj10Ob5+pdxLoXccANScyST4Tozs0LXVsKlysnj/+6r6k1s9ghr79Ja8X5UOhrC86YQ4JG2gEy1nYaTqm/iDxsiQMAQKmEBZdcguqmTagfOtTsI8ZPPf449vy3/4Z111yDnhNOAACUlyzB0te+Fote8hLU9u1DWquhvHgxKqtWIRkYaMlojI6itnMnQBzGRIzE69LixRi87DJUli+fpaem88D552PkO9+Z0VbdsAHVE09sfjmis/79F1zQ+mh9RqWFC9F75pnNb/KHzddYPwVQ27MHez/wASzdtg0r3/1uLP+Lv8DeK69EOj6OxvAw9n3oQxj66ldRXrkSqNUwtW0bpnfsAGo1HLj2Wiz6gz9AZe1aLH396zF2xx2o7dyJdGwMh6+/HmN33IHqpk1AkqC2dy+mHn8cjfFxpN/+Nha99KVYeNllMwHV6zjy5S9j6vHHUV2/HpMPPYTGyEgTw7e+1fzG/2oV43fdhant25u2W78eAxddZNY/7wFF4yXFkpQ7QuItdK5Vfwu/mLyg7fN5bEHJkfjnvbSV+MfU1qGUZ+00ynPxos3hap5QflqNFVuTUTyKqgepuaE1vx9DReWwkLm+bMt4blye86k0vug6M5SvRtL6ufaadQEQWqQVWdSFJDhpXDuTl4ViN7aibBlboIf2FTknhleon3TisJF3vGV+bCGRNxFKGIpOaJY1a3ccz6VMqZCNxZK36DreKUkS9J52Ghb+zu9g4v77xZ+HG7npJjz5V3+F1X/3d+g944zmz9pVKqisXt36eL1LaaOB2pNP4sC11+Lg0XfTRSxCX/buf9+ZZ2LgwgtnfGmelfrPOw9JtYrG0e8tSABUTziheVDGzPXvO+00VDdtwtTWra220qJF6D3zzGN4/dyh6ZH9DGC53PzuhXodtb17Udu/H0hTLHv961Hbvx+HPv1pNIaH0Rgfx/h9981gkQBAtYry6tVIKhUkpRIWXnop1n7wg9j5pjehMTyMtF7H5OOPY/Lxx2fOLZdRXrKk9QsGSW8vkt7eFu768DBqe/di6X/6T5h89FGM//SnqA8PY+wnP8H4XXcBSdLEfXTukj/8QwxceKFidUd+h/bAdsuOpdADWJEy57K+CxnTSdIOAnl5dXJ+CP+i6puix8fyKuJ8ZmmfS/8t0vZFnKm0i71uJKtNZlwAUDdned89Df30QFEk6aLNyyhE75iP7FHjfH6x9nf5Fv1OITVO6o9ZZ+5TDFb+oZub5VMTIb4QIrsTfLhEWGQMauuR13ZWexS19hpuV98QeVYslP9R7f78vFis6+fnSmmsJCfEX6zrwcovl7Hk1a/Goc9/vvUpAACzPoLfmJrC0Ne+G9dKOgAAIABJREFUhsmHHsLyt7wFCy+9FJU1a1BasODYl+I1GkjHx1Hbuxejd9yBA9dcg/E775z57n+jgcbYGOpHjjSfH/3/el+eSwmApK8PC573vOblg0KUv/Y+9anof9azML1zJ5AkSHp6sODii1FZsWI2g54eDF5xBYZvuql58E1T9D3taeg97bRZcgAgWbAAPSef3ORbqSDp75/FstTbiwUXXYQFl1yCqW3bmjZJU5RXrWoezpcvx5orr0T/uefi4Gc+03zXfmQEaa2GpFxGaXAQ1U2bsPjlL8ey178e5UWLmnx7erD4la9EZcMG7L/mGkzcdx/qhw41v3SxVEKpvx+VlSux8AUvwPI/+zP0nnwygOavBgy+9KUY/cEPWv/mUF2/Hn1PexpOuOEG7Lv6aozccgtq+/Y1vwQxTVHq60N5+XIseNGLsOo970Gpt1eNO6C4fK3ll3btD3n2Uyl3tiNPxtQn7lpZ8VhrRy0nW2smCXMsDopibGfd84qu72Pr2JB5RdUpRfHIc+5yecfWRHnWUPLZmHwSS3n9wK/JLPjadbYt+gybpE3KfUCLmZfnoBCCzbLB5SVOr7ybnua87XK0UDyxG1uoPMvhzLJ5WQ987fBH69giYszCp1MbdRG2zVOIxVCn187npRW4QPsuiCQceYqqdl1eWA8c6fQ0nviDP8DQN7957DfhIRzIe3rQf+GFGDj/fPScfDLKixcDSYL60BCmH38c43ffjdHbb2/9fJ5L5RUrsOh3fxelwUGkaYrxO+/E+D33qJ8QqG7ciI1f/CIGLr44KpYbExOYfPBBNEZGmof6JEHPSSehun49aaepxx9HbceO5q8HpCnKy5c3/wWA+AWA2sGDmLzvvubYJEHf2WejtGTJLFun09OY2rat+ROKjQaQpqisWoWek0+e8amG6d27Mf7Tn6K2axcaExNIenpQ3bQJfeecg+r69UjKZUpR1I8cwcR992Hq0UdRHxpqfgfD8uXoO/ts9J511ox5aZqivn8/prZubX7JYZqi1N+PntNPR3nRIqRTU5h85BFMPPAA6nv3Im00UF6yBL1nnYX+c84BenoK80utXeuLkakdINtVE3HyuPGhud2aS4raS6n2TqzjXNV5FA4gLkeH7CFS3RcrLw8V4ZvdUsMXQZYa2rKGc5EbLdSOM2SM/1vbQ+TPuNCwXAAUeaCleHYD5TF40Zt1p6mb5Hf6gNcNFHtwtI5tVxERym+u1q2ozWSuL4dix2dUdAHVbXEYkjv2/Y//gd1ve1uYgFIJpYEBJH19QJI0/399bIz/WcEc1H/++TjpxhtRXraM7Lf6dKf8u10HyHZczLbjUqsIauchJzZvtHNfCqF2XRqGyrP2d4o6tbcXYY/YvBQjq0ieeXQv4lzRjhqhnfZvh/x2Hojbha0oHCE5LhRLKWPsFooSJYn+RRcur+y5zz+2iLX2cXK58RweC05pY7K0F2WLWGrHRhZif1d+rL01GRyeoigPX4v+oX5DHfz8S7y8FOo3Wp5p19pIOEN08McWETcxNgwdb8nZQHiOzrPxtoMs/p0kzXfHh7/9bRPPGZwaDTRGRlDbvx/1ffua764zh3/LT/xJ46Z37MDoj37U+ok7n6w+3Sn/jvEFzQ8kPWL82Z1LFUpF6qvplrcOCJ0Tsq9k44vyoyJIqs9C6i9rf7tyn0QxedHf24uSHXoxFlq3WWuXTlHIGYiaG9pXRJ0bOo97MyBU76J9QSPJ//L4PVcv+DwtucJ6zpRw+HNjYttSA7l9paxBc2LqUM8xDQ30NJ392/S+fA2bz0u6OaPGWwzmjpXmhd4s+XykwyqlLzdW00Ubw+GzkLXIouwoBROnt+9/Vv2s626dR9nKnxezfm5gW+KGs4F/q0jhDLGdFguabC5v+PwlXKHJNySeNVtosUKtVbtil1tTyX9D8HO8866LhkWzp0Vm67FWw6F//meM3XYbiaU17+gjtfMkTj9H2padeI8+1Xbtwv5rr8XUY4818QTamFtz7bWFNyeLGif5nlQ4SetLxSvVxuUTX7ZFLy5HWHI916/J1EjLWdK+k7VJxa60dnnxS+vIyaJ8m/N36oBjtRUl37KOnD9yRK2FZr8Q/tw8qk+SLR0otXiV5nG6ULEp6RsSM9w8i4/7/ZI/WubE4LZg4+Ii5o1bq4yQvKDldr/NUq/m8T9NB0oPf2zIZXKML2sXNlpe9/tasdZoNNIibmMsDuYCzfPukcWRNQPk4a+NzYsxD8XwDbVXEdjbob+/gYTeYufF1K126UaZRct3eeThNxex2268RcgJoSLiCMj3kTeufeL++7Hj9a9vftN7BynFsYsDTiu/rzQ4iFVHfzIv+zZ7UUYb80/R+0pR86g8D+T/3+8Yue3YO7T2ubBxEbKK0mtWQTtH+1go3k7Iyjs3xseKjotOUBFngjz1R7tq7DzyqTEZdSJvdCrnWH28m+osyddCZZekgx/1nLud497Zo24rLDedHBbuZtfnz5FmnBDjcWPdxSmCYm+KrBRqrzzrR/G13LxZKEn43w612CU0aeeZb8FA3YaGkmXOXG/Q0g2vVWdXhzz6FOknMdi5+UXEe2jcSnI1OXnIjWOrLG4PcNsbY2M48pWvNH8C0CNNy7yZXHvHn7oYaAwP4/B11zW/uC5nHOf1xRie1hyfBwOV54vIBVrusewvReistVvWPGaviin4tfkWnha9uPFF7WNF5Lwi6zMLjzzx3c5aslMXztJrjYo8/Gv83Dkh46X5ecla83AxxtVu1nNQ3vxkJe4sY5EXspdRZ2SJQu0jXXiG2rxEHeYpxhxT/wZFOqxyY93NVrpckIzK9VlkuGMlHO6fZT7nCFwfVXRwtuLmW/TwbRNjK00+h9W3FYVHwhriA5rPaLpKtqLa86yH5lccDk0Gl7hCbO22S/JDdNX0yUiLk1j/tvCJWTPK9jHzfd1D452yAZc3NDtabaX5R4g9OVyarST8SU8Pes8+G5XVq5ttTn/ivHbb/ain+qhHro/jRclP+vsxcNFFqKxaNUMP6rn7WrKnxCdkPQD+XwNj471dsUzpos3n3mgI8U+fQm0eG0ua/CJsrq21dNkYwkfqC80pVhmhe2beNdN4W+b7+Y/jy7X5Mtw2rVan5rdrzTSsPsXMD7EZMPvQZbEVhcP3Qet8DX87coqGlTqkSvEWqodmc6le4vSw2krDmOGTcHD657E5p6M0P2k0GqkPmFJYGsMVqpbXWRsFVJLLKSu9m+Y7DcXPgi9kLOUQPh4OHzXP7/dlcrbTdPHHWtaE4iPxkMZw68sVEtxYfx7nqxackq7+GMvYEHwZL8ou1rGUvlIscf5n6XfbNR/j7EMRZTNOX4qXFm8cD3+OttZS3Ek20nCExAsnQ9JFksnNky58rXsDZxPpuTV/U7Zw8Y3ceit2/cVfYPKBB4BsU5xlhZnvyKeA+BF+t90dC2ae1AcA5VWrsPzP/xzL3/xmVJYtM/l9i7ewvtzeYvE/zmelvCrNl/Bb876mL4fXHcvpRvGT/JcbH7LfUXykPKTZneKhybTkSo2ftM9QsrSx1jxj3SM02b5tfJnWMVoscJi4NikHW3Kfz9PiW+5cLe9TvkPJ53BYawjOllKeoojLhxxOSkeJT8x6Urax4HPJGncWe4Tg0zCF5v48PK2xF1qf+P5vGcvtNRZdNHycbahxs+ybNklcFH8y12Z53m7iFlAznjuuSCySvTi8IfwkvhpP6xgrvrw8LDpY22LaNbIUDEX4T1H4rH4vyc2DhZJJbUTcuCLj1BJ3UlLP43MxcUZh0YopC0n5UcIsFYLtyGcWkmRrG/7Yli3Y89//O0Zvuw2o1WbxTvr7gSRBY2xM/UI/Fh9mXgq0eANI+vqQTkzQh/8VK7Dqb/8WS1/7WpQHB1l9g7AUvBeFyLFiyWRLxWyIDfLmUR+bBV9eWTFjtKLUwjPP2ocUzbFrl9c3rfm/yPgKGVs0Hut8i69ze3W3xGIonjx1jmXfp3w/hGceX7D6VgjFnC1CMeahdsRtkRit+Xsu8M24ANAODhZFsvExxWpsgpEclArMGFycTtaEEHIQ4/hI8ixzYhNLbAKwFAYZxRywNP7cnJgNjMJgWc8YGdL6SYlCw6LxzoizD+fTIfGuHcw0HkX6dp5CIBRL1k9h9EnTR8KtxQeHRSu0OL3zxlNooS/5oKSfPz+t1TDxi19g71VXYfjb30Y6NdUa03PKKVjx138NJAmO/J//g7Gf/ATp5OSsTwG47+LDaQfRl1Fl7VoMvvjFGLjgAhz+4hcxetttSI9eQCQAqhs3YuW7342lr3kNkt7eWTpYC4IQH/HjN6PQdeHmcHxD9xGKvyV+pfrGGhuUfAmvRV6eHEiNse7T1jrIUkdpsWi1sTTW50/JDcEvYQnNRz62UPwhMtwxRdWFEk9pXkzOp2wQsu9w8ih+nc4toWMoeT6OUB3y+IOmh9UHtH3EisMaUz7/0LjwfYfDGxNvGg+uz1rDWWVmROEnPwEgLag1EVg3j5AkrRWrFD8Xcwheil+MzlpgF+EUIbanxsXy43D5+sbYLcSGoTpzGF1q9zpbdNbiI3Sdqb48OncTjnbLss6L3ShjN1tLHozV2ZqrQ3UuIj6K0DltNDC9Ywf2vu99OPylLyHp68Pi3/99rHjrW9F7xhlAkqB28CDGfvxj7P/IRzD+058inZwEGo2gb/NPenpQ3bABS175Six6xSvQc9JJKA0MYHrHDhz63/8bBz/xCdT27EHvaadh9VVXYfCKK5D09s7SJU8etNhD6wvxlSJkWfhZdZZ82cqDw6jZqoj40HBIOheFw2/Po7NPReT0vPERk59D+RXlK0XyyHB1QlY38nCpqFyq+WIRa2TB0SmdXV5596AQfnPhbyF50ILDkrcsdvNt52OkeLQuAKhJ1EK4z6k2iiiFrQ5OGYniKRlASnLcWEoHbuOibEDZiMJuwcnpJuGTNh5qDIfT2uZj1HyECiRNP41/iD38cZovS4HPzZHwSJgoedyYbL5mB8oeecaHrC/H38WekXUtsrF+m0vW3CTZj9M/BI/FP6X+vHlJa/NxSm1S/vTlcPnWkpOt8cvJlHT229OpKez/h39A7+mnY/DFL0bS0zNrbGNyEiPf+x4OfOQjGLn1VmB6mv1ff/d57+mnY9kb3oClr30tKitWkPpN/OIXOPCP/4glr341FjznOarOIbmc2kO4GLQWJ65sSx72ZVPYNXmSHag+ikL2Ct8m1KNFjrQPh9QUVl/gXnNztRiz7lEaX8l+Vt/RMIXsFSG1gzTP6hMcHs0frLkz1v/z2Mc611K/cDittYDLR9v7pD3H56Xh13QN3eu09ZXWJnSctqe6NtF04ubkyTGafUPj14I3dKy077o25vi7fRbd/D6rD3IykkajkXKbNEVSP6WwLzyUZyhJGNzX/mM7cXVSv3bNjRnfDgzt4F0khiJ5F2Wrdtq4W3DMhW3aiaEb9NH6Y/eCEBxF5gsRb6PR7FN4D33jG9j153+OqR079O8GqFSw6l3vwsq3vx2lgQERUzo1BVQqSEolgyY0dcqXtX0eoC/k8mIqcm7I3gDwFxlFYgqZ2w05vVswtQvHXO113aiPP7/I9cmzNwD05XQnKSTXaHkV4PXJY/O5om71ZSuvIn23G8jHW8oa3UfpeXZozv78fmpONs/tc//cWwn3kZPj85Zw+Hj9Qz+FiyPJThoGio+Gn9Lf1YfDx5FWpPl8/eeUbB+jpJdlfST5khzNF7n5nP/5uDW+nGxqDvfal0OtlzSew6xtOFy7ZV0t9vJjz2JPjbcWB9LacG3W+HYx+OP85z4uCp90+Ofkc8+5m2NpjqSPFMMURk53Chdnc2msFKsha+3rn5RKx36GT/CrvnPOQXn16tY7/K05zvOMKsuWofess5pf+MfgaNm8Wp1x+WDJfZqfUuN8nhlpB3rfT/z84j6n8hSHjSLOlykskk7ceC4WfGwZBt/nfNtQ+CWe1pzF2UKLI0lfSh43RsPm2oGzi+W5L1/Tl8IrrY9mc44395oiLq41H3FxWHV326l15PBbal2u3Z/vr72EjeJjnSP5bhabVvyWdeXiQnquyZH0pTD78eSOt+YPP0drekn+aJXr45T0pfqoHCPpT40Pkcu1SXyoWprDxpEFoyX+JXv547Lns84UqSW7KeQ761xQN2CYa5q3wTz51A0+MY9h7uXPUzGU1uvY+Z//Mw599rNAozGzD5jxqYC+pz8dGz71KfSfdx7Na94nAMjF1Tz95lE3xMU8hmMYgPnYnKcmdYtPzmMohmZ83lC7FaKeU+Ol2wsLX+32iXrO3W5yt0TcLZdFF+32xcLbenvjy6b6tXbLOlAYpbGcHG6t8twQ+rwlfBa9JF0sc6U11fBbZVmxSHK4PmmdKKzaaw2rdEvPxZcmyxJHbrv2yaUQn7X6OKcrh1GiUF/h5mvrF+M7Ek6JlxUb1afpaMGi6UpSqYSFz38+UC43xzpdMz4VkCToOekkVE88kdVR+rSG1RahucaSz3z7WPxdkynNt7RrODW/0GRSczhsFr+J0UHDb/EF69pzfCzYuPmhuuT1KQkTx4fCQvGTPmHmz6X093lrPivZzxqf1vjTdPHJ8mmMmHWRdJHmS7GlrRknW+Mh9Vvl+zgkHX1dLXx9LNxrCY91vWJ0ocaE5IKM/E+fcHaSfEpbT18nn6flE5rUfI2vxXe1eAvxP/JXAKgJobcdvqFi+eSlEJnSWLdvLvSwEOWc7cbpy9Bex/DMOz7WDnlxtMM2RZBFbohNqbHdsO7dRO32acsaUDmZG9/tubrIuaE8prZtw6PnnYfa/v3s9wAk/f1Y+fa3Y9V73oPk6GVBt5LmJ6F7ueZnsbg6RaFxUESuC90bjqfc55NvX2Du68RfJypi79D4zZV/trvGsu6jFp7Hox8XjTnm/JX3zNYtdXYe6lQtVHKN7jJwH6nigBrnklYcSG3UrYw2lnvNYbe2uTagCqMYnkW0Ue3WpBSLm1pvLflaycVk+f8yX6aEPcR/Jcyc3TIKTTra/4ZR8qU2qz5+8ZU9l/QLtS91S6vx5NaRmsMlfmqcRZ92xzJlcwknl5P9/uzPWqBxN9duH4fPmo+5dr+P45c3L1L9lvW27lnV9evRd845sw7/qfNYWrgQfZs3s4f/EOxUm0Wf0PybUZLM/j9+i7/5860yOV0lXw21Rcg4l7i4ddsknBxeLvdT9rWuo6Z3TE7k2rU9RttPMqJ8TaOYddSwWmSE8KT68/hvyL5MjfH3zZB9lNqLijwzhNiCuzji8hJFlG9KsaxddFA6WGMnpI2SlzeWJR4+ljz7sgVnTB7I88ZTDPai9iINj1QvWvcsy/xCvgNgnuZpnuZpnubpN4Vqe/agMTbGDyiXUVm5EqX+/s6Bmqd5mqd5mqd5mqd5MtCMCwDu5tlyA+Z/dIO7CZT6LXK1Pqld0k+6dbdgtuDkcGh9eWT5z6m5lH6aLSnMoTqEyCvCZpZxGk+rLV39AN1n8vhb6DpI8WDxGQq3FKsuWfnnsSWHS8o/Mf7H9WvrpmGz6GRZK26MzycjLVdZ9HJ5hu4locTJC/UVl5c2huNJxZ6PSXo32ZqfrXuiZa/jcrmPSasLuDyi5cqi9Kd4WmwRMtZaN2g6aMT5WOi+o+0DITbQZEpxb8XLzcuz78fsczH7vq+Hr0s79jppL7DOk9o0jFo7xdeql+S7eeSFxmGMPUJ0CLF7yL5iyZGW/KzVdNYY9MeGxnTsusXY31LvuXMsaynZPMbPQvKsj9Wf1xWfANAWXXOYjEISlJSsszaLAS3YrM6uBZd14+sktRtLJ3Vtt327ad26ifIUyCHxZ41tS9z6/aE5TOMRUiRbKU9RczxRUXqEFld5+FOvfx1J0znkdUjxSc3N+qhaQBorHbo0XtxraXyo3qHUCd+29nUrhRw856kYyuMnWu7Wzg+WA7fL25/vy81zJpjLPaKdvp33sB8jK8+BOgZjt+eGkt/gOnSahn07I9VOPffnuMHFbaY+D38xs9cUbx93Nt7ifD5fn5+fZHwevh5ZG0cZLipB+TpwdqbGUsStXwg/Pzn5mKT5nGxpPIVR09Mik1s/TheNN/WashUnh7M/h4Prs/Kj1o57TulnyQ0cPj+GOH4ZWTZSd6zbTo33ebnjKNxaIeg/p+b4WCzxTsmV/CHkNcdfmy/5l0Qx+Cz8XDtK+44mi9sL3P4QzNTYPIWdxX6xNpXWOu8+w+2f7msqJil+1N7rPrp7KcXLjXf3kcPhtlM5xpWpraWUH7jLAUsMUry5Nl++lLtD+Pm5jNs7YvwxNM9I/Ch/5vhr68nZj9s7LfgkPDG51tWXs4EltiV8MbmC46fthxI/6jzgjqdilurXagZ3DNcu8StifX1eIetpyQvcGcp9HeqPfo6Qxll5UnOkfSQjbo3dRx+3L4uLAY6v9prjx/VJrzkbpmnavADwnZYj6tDtznf7qQ3Nf/R5cIdvip+/GWvzuU1J0497bXFgCpdva+m1S5TdqSSm8eOc09cnlB+Fiyr2OPnUIVAqwCU51CNFMYVbRpQdQtZTK079NioOXBzUerk8qETOxak/ntrIpOecflxh686hNmDpUdqYJP9y15sqAHxdKB2pcdp6+MStv1VmCD/J37T40fBx+loLBGp9LGSJHypPUOMoftb8we0v1vX3X1sLNUs+dvFZ5HJ6STlS21fdPm5tfTlSTFvW25pbXdk+HyqHSHuVVX8pd0oFJIXD928qN0prz+UKrt+VJZG0zlwfVdy6+kh7oMSLwmXJ/VQ75+uSr1j4UeOodZPWM01nH0oof5Z8J6Ym9ce7tpVqQJ+0nBqCz9WZ2wMsOZurcTU8ofx8vhQ/ib/F/yz2o/hr+lr2FgqHpJ9WU7ivKX25vcwnKn4oflQNRelB2dzXm+pzX0v1j58POVkuRo5P0mg0Up+h/5gRZ0C3nwIRyy+U8vLX5sfo54638Odec8VG3vXiEi6no2aLonTxeVFjY/FRfSFrVXQcUPwz8ts0vaX5WvKR9AqJpVDf6DR/aSOw+mPM+ksU4l8hvKS2UB7Wfqt/h+TamPkSPn9+aH+Mf1mpHfwlnkX7BjUeCLvUCc1NEn9LbvfnW+0Va0MKY8j+UkRdFoItZH6MffP4d7v9K7S/Hfjb5Y/a2kgy3PkZDyrW3H6NP+c71vmUrSx7h98myaaw+PVVSL+kH6evhD0k18f6fWjdaeVvee3yt/ALwaNRJ/bK2LqTGyPNa10AUIFscZi8yS4vvyIpr65zhb1opw4NIi2Jh46LxanNCZVfhK8XGTvzFOerGVl91J3vy7H4TmzylqjIArWI/nlfbj9ZbCwVt7FrFLP3h6x/u31VG9/uvD8X1K56TZNn7S9izYD4Qr6barnjwZ+6mTRft9ahVv5F5A/AfsETmsfzvp6n9u1JsWeiUB/V+HH9pawzSeSPyrjPXeLG+Y/ueIl8fj6PNJX/x4WbQ/VJPKg2qviS+GvjLLi11xa5kiwq8fiU+QU13n3tP/p4Kb4heKmkKs3XCmYtwKy4uHE+fw2/xs9Kkm20eImJr5B27VHjI9lUGmP1UXdsqFy/z+dLkWZry1paNnTO96jixPUBrnjhNjNpfTkf43S17itSm8TfKjtkDNdv0VXDbzkQcXmawsatg8vPHUvJ59ZcWx9pPJWzJZ7SHumPp8jqj5w+kh2lcdbcZ/Frv+jz2zW9LL6cx/+18dze6fo5l3M4fBpJ9g+pTajcZp3LzZH6Y+JN8k2L7SQfpnya4m+JTSlG/Dzk+7bfTuU/Ko9x/dzZRvINiy/5/T5WN49T46m5lH04ff1HDT/1KOHRMHN9FFnlang1/4y50PF9j9JFy7++r1rOJtI4ip8oLz3aqzmOT1ySzHtTpvHUiAvSELkWmTH2CcVRBE8LhdqjCN3agTOGOmGvGLnt4NEpexXhT+3QrRM5rQie7Yi3GFwatcNeFjlzZZ+8POeKR7fyjBnTib2oXftb3vhqV55sR76eq9pvLvaAdtirHfubhTpxDuhE/rbQXNgrhken6qMieHRLPgqV2474mqs8GfK6lKazb5EA+vbL7afIB+bz9Plk4yWZlLI+L/d5kti+0dGXq/H323zslBwfnyTX1V+yF6Wzj0uS6fLzcXB4OdzSWM2fKL6U7py9tDWVbMTZlNKfwsQFrIaf8n1fBykWrHIy0vyLi2fKHq7u2nyf/Dmcj/pyKCyUn1O6STzdNveRWhPKj30elK043S08KdyUD3G6WdaJspeUO7T8xeUoLldw8cbJlLBLsUKRJWdwfDi5lO6SfKsfU77vY9RyvrRX+TpR+Ymyk+YrGk/J1pLd/bzg529pDoU9s4//WrKRP0Ya55KFryRD8i+Op6SbhjMbJ+VvV7Y1ljlf8HlwdUlM7pB839eds0uIH0trwOkampd8G1jqQ0ofPx+5/Vqtx60jxcOdw+U867r5OlDPuXlc7qB8zNeds7mvq4ZD6pfsodnG5SHZzLcF1c/lAc2/KP6Uf1lwSrmFspc/lsPFyeX8nJrD+Q1F2lpS+kqxIPHwX0vn7NYnAChGoTdGFqL4SrKkpGR5HcKrG6jdmDT757GvRVZI/28KFWlTaWyR/t9O3kVTLBZpI+w0rm6ybydlh+TzPLy0sceTvxdJ7coRedeunTVDu/JxJ/hIPEPs3057a/O7jfLsH3PhV3n8vZOxE0ucjHbWN3nGttP+eXC3k8fxRMeb/xdJs34GMCPqtpl7Ld2iUDcq/nhpY5HaudsO7maGu33iZEj6cjI0XTX80mtfDodVsht1Yyvdwvl4qVtTTq5/g0/1S/4k+ZVmD/+1tA6SfOuaUKThsNif4+32SXZzn/sxTfmCxEeyD3XLSM3lZFE4NFuE+IokU7KB78OSLSw6uGMoG/n8Jf01GRJZbSk959aUkqXZhxrj2oiSxRWBnGzK37nX0hh/7SgriJETAAAgAElEQVTekq003hIm6/gQftKa+e9wSfr4fKi147BJ7S4v97UFj5RvKd5SHqQeqXqD04Frp/xcspc154QcMqi5WoxwrzXevn7UGxL+a83X3HYtzmL4czIp0vxA81NA/x9gjrelj/ILd+0suYXzPW7ft6wfhVuzjcZbyimx8t12qY9rk+JSksnx53jH6GfN9RpfnzfnC5RcKT4420qyJeLsz/H386JU9/pzJd00+1op1DbsJwAkAUXcMGU0F++mhfBrF9Z28HOp27HGvhNk4d+N/Nphx3bcNBaNs908i+Tbbp7t4tttsd4u3yxSDlX4FoUpo+PFh44XnN3Os51U5D7U7bm9HXx/k+OyXTxd3t2oe6f2oSKoXWverpoLOH78vVvPBBmvjOai7qrU6vVcQudpnuZpnuZpnuZpnuZpnuZpnuZpnuap+6nSqDfmGsM8zdM8zdM8zdM8zdM8zdM8zdM8zdM8tZmC/gUg70cf3I9d/jp+xKedH8uWvichpq9dFCLzN2X9Yqnb1q+Ij1zPFc21fJ+6bW3zjG0Hnm6zj9831/aZCzqe9+3j2dfmWuZc+H4IzeP5zfHvuV7rbrPlXNDxhKfb9u1u85+k0WiIFwDUl8FY+twxGYg8/LQviuF4UP/nSf1/P8XDx65h5IjDEIrdv0Cx4LDaO9YeobI0HhI/Da+1zSovdI6EV5obyyOPb4f2WcZ1wrdDfbYd49ohy8pDwhSDPxaHJVcX5YtF56YQTJxPWu0Wm7clKmLfDbGHS52Kj5A+jqR9N3Zv6UbflqjovBLrv8dTrg71lWysFOMhNg21cQhebv58TRm/DkXXVN247xaVm611iAWTRXZoTWmVLdUJQFwdYs1NIXWIj2XW+EajkfrgfeL6fMZUn8abm6MBp2RquLlCzsqD40fxt+rL8ZMKF26+RUZImwU/h4nqi+HJ8YnV3ccYg0+LkxDdNR/gfE/D4o7JsIT4f4hv5/EdCkOe3OHy0+yn8fP153iHEGe/jHee9dfmhvqn1X4xMcrl8tjYlOzqytBygj83xOYx+IpYa2oc90jpZuEdm8+1uXn4Urxi/JzDlJE0PySW3HFc/rPu85rf5bGBNTdLOKT8Y8Gv4eNsFqsvZ18pbmL4+bwpftZ4tMSoBXPsPImfVjvExg3FP0+bpRYKxUfJi/UdKd7y1ISW/bbo3BGDOaReykPSfqnNy7DEjNNiXfJXq1xJZoli7j/6Qeu3ZwZz/yiQfrsrV1KcCyBKFqWLhMnH5Y91dXNxUPK0AlOyEcXL58PJp3hyz/02S5+G1x3rrhmFUcLm601tGBlR7RReSq4f6JpfumOkeHH5+jHB4aP4+Dr6eKixHF9rUg/xB79dGqf5JpfAXF+XeLj6uD7h687lMI6vFmsUSRilXMph83Xh/E3i4+dRHy8lz+Xny6J01/K7i8Vfe3/NJD6UfSWZXA719XT188dKecfq5/7aUPmJsjWFRcvD/njKb1yiYozaY6k2Kf6ptdZkcfy5NfefUwUcJZd67j768WLJXxLmbBzli9L6+HhcOZZ5kg6aPG3fdV9z680RFQ9+vyUXSj5E8eP8048tzS+kWHf5UXaSMFJjKczU+nO8fR/z5flr4c7z2/x5bpuEl/NVrobz51L7HKcvta6+PSi9pAMop6s0l4pdSj9ND6mmceVwuU0jzS99zJweLj8qf1AyLHL9cdp6cnnYkp+5ORIWv9andOBijCIuVv144PzAx63tHeR3AFiSqmWcNTlzB/8QLBxPaX4Rsix8rX0x/KRxMfq1Yz0k/ta+oqhdax4jK+96cJtMUaTJbkesuAmqaL2K4FmU/7QDSzt4cP1zgb9Inyhi75pLmov4kGKz6NzQSfvPxVoXUQdwe0G3++7xQHlseLzklpharIiaI6TuKcqWWn5q15qE1AtF1fl5SVrjuajRO8k7Zh/r5JlCkx1KJf+Wg7ptcW8gpFsObhw31ze2fztByXBxadik1xZZvjwJg9Sv4dF4+TglXNRrV19tHndbm5HEg8Ng8RlJ/1i7W+b5/ieN9XFzenDr5uvv3xxScikM7nyXB7fuGl5/PPfI3epy/KnXvh4+Tn/Tl/hImKl53E2tZB/NRzWbcPP9OMvrXxZ7U22c/2u+KNmPwy1h4fTmsFrlcngpX5D8KERP7lHCbuHjjpX8R5IlYaDepeBs6POS9iiLrTR9/dfaWlCvJd4Sdg1ziAx3/TgMkg9z60UdaDRsIXgtdqcwcnikWJGwWzBw46xrKMWVpCeH1x9jqTksunNjKfkUXiqHWOwSG+uu/lrsaTK4OKIw+DaR7KO9pvSkxnPzJLz+WA4Dt3dZ/M+3Beff3F4r1ZuSPpJN/PmW2s9ia8kPOAwc+Tq7PLUzkwUjJUdr4/hJfP3XMz4B4Brfn2x5J1Mbp5F1vEWehZc0RuvLKM+7HlZ7+3Lz3ExT8zW7Ufa2YAldTw2rxs/ipxpmCy7rmsfokIes+lljw8LLgsly267J42LeOq4o37XmuLy5L6+faDkEkP0yJjfFrIt1vsaHi8u866jh0OTH8o+RD8z+d7ki4iE0z7Xb90N8xcUlyaPGhfZbZFnwx/a309eB+H2lXetrmRezdkXm4pD9L08tmZdX3vztjgPCviMiVF5Iri9Kf3ccEJYrQtbT4nsx+5ulP6YuovaRjIqok4qIFUmvouxtwW2VZxkfO88n8gLAX0iA/mgZF+zcfA0MNY+az8n3eVOFkD9fSx6cbIq/O9ZSFFjwhci36k3xcMmaUKmAtxYL/vyQ4l2bz8n3g0daI0k+N1/jR/EMKa4o3tZC3jrf8pzTkUtOnJ9Qfsv5MPWc0s+SV0ITMEVW+ZLuFuJyal753FhrvHM5X1pTDldsccTpp82h5llwUDpa4oFqo3KHZUOX4sIq35/v49fsHLvHW2RTc6W6gprP8ZAoJgdY5nLzqRxYhN6+XG2tpEJR8jlfB8t8q/ypgwdx8Ce3Y+Tff4n6+Dir3zwdn9S/cROWPvMCLDz1VJSq1Rl+UhsZwYHbt2DkoYdQGx2Za6jz1IVU6u3FgpNPwbILn4W+tesA8OeHrM96vgqpY6znF02Oz9Oyv3J8Qs84ub4DQCMO3DzRJG2m2WugPTfVvw40b4944gp87nKhW2zbTTgyCjmQzSV1Ex5LbpP6f9MoRv9O2qybc3HsvtpNOswlaXtDHpoeGsLDf381epYtw8AJJ6Lc15eb5zx1F03sfhKjjz+Olc+/DCsuvgSlSgUAUBsZwaPXfgSlcgULTjoJ5YGBOUY6T91IjakpjG3fjvEd23HqX70NfWvWtE1WN+9jRVAle+LfGEg3CRlxt9j+GP+55d0DTZY0n9LHysOqty/Log/3ro073+3nihCJh6QvNV6yu+XmTNNHsgdHedZHeudH00eS1Sl9KFyW+UXoQ9k2xL4uL06HkHeHfJkSbqs+FIXGu6uX2+/bzI8xq+6W3KVhpeJcupSg9PH15Owh+X+oPn4ulPKjtBmH5n2LLi4vTc88/qrhiIk/93WReVuTlY3Jk6M024bqw9k4m0f1c+vRjli25srYOoSaG6KPz8+vPzR9Ob5JkmD3N7+OvtWrccLr/7R5+PdwSrxCYojSh5ORN5YzCol7bc+hMBSlT9H7su+D6fQUDt51F/b/8PtYfPZT0bNyFQBg3/dvQZIkeMqb3oxyXx+Scjl3bipCH2ptuHwTImsu9AnNSXlym0XfqPVNUzQmJ7HjK9dj51e/gpPf9GZWTtGxLOWWIvZSP2barU/JF+Ir6i9ktkFS49wN9P+z995xcl7V3fj3mZnd2V616r13yZKLZMuWC+7G4EZCsE0nBN4kYFrCm/BCAr+EJEACITElJJTYOG4Y47h3yXKRrF6s3ntZSdt3Z57fH6tZ3717zr3nPmV2JPZ87M/M89x7z/mec0977sysqKJPydDn6UWYkqVj0Uk3kDqH4sG9UvroG0PJoPSl8JhwUTyowLLhtM33fb+P01H2oGym6kbx1nU3yeHsJNk/yld0HXSMus9Te8itp5IexYvCY4qfHKl24mKF8xd9LSeLG9d9zKSPLT44f+dsT43rydf0nrOJRB+bnalELJXJEYUliF9S6/X3OiaJPtz+SuLHZFt1DpXTdKw2f+Vsq/MxzXORS42ZeNlsQ63n9lglan+5/VPHqXWSvQ4SyxSZarw6LrEpZzNqjo7ZhpPbMx2nyXa6PhRWfT0lm8rrFBZ9nNoffR2HS1/n2mdw903rDz39JAZfcx1SZWWAQ1xROSFILHP4TT7FvafqGKe7xCelsczpY6vtlCzOl/S5NtuoOBPFadTMmYu2AwfQceJEz7yjr76M+ksWIVlWBi+ZtPLW+dr0MdnX1Geo45x/6ddcLtB5UfFoyifcPnPxzuHUZVA51yTLltM44uzvtH+JBBIlJRh63Q049PT/Gvlw+lBYpLFs04XTh+ubVEw2PpQe+jzunjqWw5GgThzU91QjrzNR56hj6v+UYhQfnfTAofBRxuV00o2jz6MCiMJHOQW12fpa6pVLcpIHIX2Obisdo24/Ha/JqVUZpv3T90XHrF6bHlhU4pKYjSifpZKyjkvVR8KXu6fK1O2j7w8Vizofff/U+xR+Toa+nnrleFD6UvMoH6Ewcjxz1xK+ug24PKHjpYiaT+2fKp+SSfme7gsUFsqPqHUSXUy+Qullwknho3IUx5PCpOceTg5HklhV5+k51FW/3Lgprrg6qcuT6KfyoPZE9Ts9r5hw6Dq62EL3dXXMlIsonaQ2sdU7ircux0TSvaCwmmqRqdaqc0w5l/IffQ4VcyZbmtZxfmKyCSWTe8/pBwAdR48i3dDQZx3XV6k8Of1MfZzOw+Sv+t6Z8ihVC2yY9XscXluvpK6zxbWuD2crzncpfCb75P5PVVYi29EOv7OzZ17nieMorqs35l/T3nGydZ2pdZxv2WoTlwcpGep83Tacf+j53BQ7Ljlf52/L5Zy9pKT7j63GUvd030wPHoyOI0eMcnVbcbx0rPr6ILXaxNvUJ1I52fTe5JucvrnrFMWAY0yNU5spLRy6HFsDyBUUFYtpHYfVJNMFH5UsbWtNdjLpa5pj0ktaoG3NA7XWZDuOJDqa1gbxN2p9jlz2MDffJl9fL403F99UsbiM63Ns63P3XLG65BhJnElt6iqbu6/LNDW8khiTvKcwueyfJEZtegWNX8n+2OxlIwq7iZceq6Z64LKXJtzSeba1+nsbVuqhQSWb7ai1kv11qVNBaqOk3rk2bLo8LiY4TPp93c8kPKS+5RJPNv+mcEp1lNznSBITklql3rM9jHB1PGgepua4+rPUD6R2iEqepG+VyAmaI1UM0toglcX5vJQHVWNsPWLQPTXNMfUf3HxJbXTBaMsXFNl0DLovJnncc6GEF5dbXPKG6RnBpr9NjuRZzSQvoYI0KaC+UgxN61U+ptMl6r5Jtit2aYBL5enEJSwJL8lpmsR+tvWcbK5BofBR4y6YuDmmvXfVVV+fIzUoJD6h66pjsu2x72fR1dWJjo4uZA32l9zXx03+K6GcLWyxa3rwp+Sa9kt6nzvtVHHa8pKJJ0eu2IPoqo4F2XsbDi6OqDWUv+u2k/CidDDhDrI3+nyp/+bItVZJMNj23iV3Bd17iiS1h5pvkx8En61ucWs4cs3Bum5h86YqWzJPxyCZb7ovlcvVMhWTaz6W7H3Y2FGxcvzC1EaJb5nI5s8SfKYxF1+k9lmyFyb7S2q8qzwpLxsGfa20n3O1qYsfmOyvyg5rP11vCXYqHij9TLlAiiuq2JHycp0fJC+51gsqb0ptG0Xe1HnafDOhnjRQQFQD2E7gbIlQP3njTkRMp0yUDMmYjXJ6SnWl1nNF2rQJlN1NQUzZz+YUVKPEJS4TPmou1YTnrqlg1/XS7+v8TPMpvFwwcePUfAqDbj/OtrpMr+0E1ry1BI8+sRyHs32/bsfhNF1zyZxr8Ljr3D1bgqLspNtHj1kun1B6UfbTT265fdLHKf42nvoc7uRU11HNGVL7UfLUcS7/UDnAhk/Hysk24eJ4mRoQEz4uXrgczsUpV0eoXGjyVZ0nVTipeOf4q/pIfILSj8qhen1S13M5lqohOj6TX3C5luKXW6dj1+9T/Cmy4TPFu8n2up9xe0/5C2VDCoPJzym8uWuprLAHGJyfS9dy+CS9U26t3r9IZHL3VLuxdZjJmxRfWy2R6MrlD9PeSe3Hrafkm/CZ8iZ1rcuk4tuWN6V+6pobTDmQwsXlTVPPoccnl+8oHdS8TtlPl0Ph4tZT/kXlIm4OlXsom+i66STZe5P9KF6SWibxKVNutcWniZftviSm9Tm2ui2pBdK4T9mckAKlJ0kbCNV59XsmwLYCalqv4zMVPRs+im+vsY5GrF21AduPNEFehvtSUfUEXLloAsqIIDZhooJKv1YD0DRfalcq4QNAZ9MxrF+3BjuOdRo09ZAsSqGqbhgmTRyLYdVpJAinpmzNJTIOjz5XvaaSqkmevlYn0nZtJ7Bx9Zt4bn0Vpt90AYYmE6R8Si9KDpdgbHrq+HTM1J7b9KT8RddNv3Zt5nTMHH7uWr1Prad0MuUoSUxSsriYpPQ34bTpxTUrJh2oMRU3F18mW0jtosvniItvU9HlrnV9Kb25+sb5rykWKLLh1vfJlIc4v7TJN90z6cmN67Gr4zDlM1NzSBEX85zNODn6PU4fWx6WyuT4S/KDKb44nLpNKJLGgi03S33RZhcOGyVXxcrlKcnecrlKlcnp7bq3+hwup0lqjSSmgtY8nbg6zvUQJl/gbKXLMtVgk856T8XpY9JTx8vFBlebOFlcf2CqvbosalznbfIfk09S8jlb2mqyRFfXui+p79w4F4M6Vsl9ih9F3B6a9lWKXZ1n2iMdf+5eypbIuDGuAOrvOf4SuSYZLrJscsJiQudJrFv+Bl7YeBAZowQzlY3ysHDRBOT+9dMwjq5fS+zBXdv2Tb2XaTmO1W++gpe2tMAHwCH2EgmUllejoWEIJs6aj2suno6GslSv+dI9DOprtgSauzbJ5JqinvEcX4W/jtcl7oKQSY7UB6jroGMcFtM823ybTSX5itpLbpySzzVCOTIVMqmetvtB9tgmn7KNPtdWpCWF0oRVGoecDH1cUjNshd7F/6X6u86X+nvUfmLCYuNJ7ZWL39seUiR4pDndhk+fz+UJE04pflsscHwluY96dcEaZr3Ep1xqu6vtufzGrZH4pCT+Xe0StjZI5Nhku+YNCZ8o/YurTSZZLnlOUgtt/myrZdw915oVRc4P6w9BfTPoXFderrnExd5SvnrtCII9qPwUKw38iUMUG0LxMp2mmYqe5ATXxF+9Z5LN2qNsJG75yKdwY1eWVvbYRvznQ09j05ER+PRf3YFx9Cx4yWJUEDpEFQD20ysfrSePYsvmHWgsHYEFU4ehOJXoy4jh3YuqZuMLf3Y9RpcWEbOz6Gg7hR2rluPpZWuw9KkdWLv1Uvz5nZdjeEURe0qWI4lvhNlPlWzNgena9/2eAw1yB7OdOHpwF7bsOo6KMdMxc1gFXLbadpop9RtTLErkcmPU6bEtFqX8pbnJRQ+TL5g+dQhyLT1JDpIDgtpbuhdxxCKngx53Ls2TiTj+Oj/bwUJY/hJ5pqYgitwniamo/IbSzRYn+j19XZA8JcUqIQl+irfNphSvMH1OkDHXWNdxcbGdr77SxtsU3yZ7S/tWG1abvW01XSI7TK201akgddeFouBj8oUgsWKaz8lU74WJ0yj6HNNYlLHI8XfBYsIRJrfGkft0Hq41Vn0N6veu+9nrAEBXmANjSkq2uTpvilwbPOl81ciuyY4zLAD4SKCktAylXEJoK0VR0gO8FMqrKlGtjUuaG1NykRZhu3NlcerQVjz10G+wseFKzB4/WHwA0EcHrwjlFRWoLi8m9fIrq9BwzQjMOG8OnvrNY3hu/bP475fG4v/cNKnHjtweUglZ50/ttV7suUaL003alHE26bM2045d65bhV4+vw8ibh2D60AokQ+RdU5Ey+S+H1VQAdR6cv1INGbWeksnpRenHxZDJ511yii0ZS4pVkOQuLSDqfHWNan99rj4myUP6e/1eVGMuMUWR7kcUf90+FA+Vl86XyilBGxwTn6C1Tzom2QMpryCNiy02TDbKjRvrsyVvU7mEyk0S/DrFESs2OSp+7uElN6av1ccouZxtTA22icL4i37tmreldd+UIzle+pjJD6k8bcphaiy4+CqHM0ju4fhJ15lI0tty9pbuKXff1FtIZFB8Keym/Bm0Lprw23IrhcUkk/JZvTbq8yic+piKzeb7lF5cPZHsp63mmcZMciT1geqV9WvTGMXHFiO9nu6o4pq7b0t+uWZKT0gmB6aKjc6PmmNbx41xOEz3dKOreubWcHbjeFIydN5U4db5mXibbEqt7/NwYEXNywHQ84k3t3/dshMoGzQWV115IcbXl2L38iV45zQth3JmHUfObrrvqDxM2DkZElu6FmHgXRtBtz3Dl9JJKtfUMOl20/lTTYap4Vb5mhI1tZZL0pSetsJkmqv7pc2O6jxTA6zP45K4Uyxq+8X5NlV01TW6f+vXJn+mrimfkfin1KdNsczN1ckW07r/m9aaGg11jfpK+ZleQ4L4tmmtKoeaQ9nfNF9fp6+R7BFVR3N66D6pyuH2hlqry9JzHEeUPaiar2NXcVA2omxmkkld29aYdKN8W11DNZO63Ti+nN7UOmkMU/cp21P1SOVjkiWRa5pL2ZKbB7g9REgeEtR7nA+Y8rGOlfJTSc9KzbXJUmVK5nJ9B7fPVMzq45TNKB56HtLzgr6OiivKJhwPUz6w3aN0ND1YcthsNYXDm1ury6byr25Hzl6m+Jb6JzXXZDOKKJvb5tnqhWmvuV5N1cXkh1zu5vIz+RMALuHoY5L3Jr6Uo9jmcvMlY5ThqIA3JVyJnvoaDQRANIkmfU2F3rVomLD2umZnynmq47yvJFAzegKmDa7F9h2HsH1vK+ZOKwXA7xd3T98/Kmnr2Ew+oV9L/dOZBL4eRKZLAxfUXzhbcz5NFd+o9sfGz4Q/iB9T49y1lI+EF7Vvuu/b9KFynYuvhbGD1O+C7KMNnwtOkwwXbNR80wNTbpwq8nrc2GKH4h807l32xcTPNdbC+IErvpzdqLqiPnxStuWaX5UvJ9OEJ4iOrnHN9TZh851krsT/dawSORy1vvZfWPXt/+m+qBmNyg9/CVOunIAiHML2r34TLTf9FWZePAQ4vArr/7/nUPbVP8PY9AHs+vG/4mD11Tj/Y+9B9tha7Lx3GZJ33Irx0xs0DF04teq32P6DN1D+uc9j0qyhANpx5Nl7sXt5A6Z8+Q9Rmcr9MeDT2PT3n4c/80sYf9NUpPvocQqbvvYhnFj97l+XSo16H0Z/+yPwXv0hdv3iOXQ1d99PvuejmPGRW1DsHcGeB3+Mw8+ugl8/B4Pv+TLGjevAgX/7AfY9vUz5O1UXY+h3PoORQ9qw+6Ef48gzq+E3zMXge76EcWPLkGD2Qd0frodWr9U8RdV0naS5i1trouw7j+PNr9zbfVE1HCW3fhYzbjkPxTiGPf/0Xex/dSVyP+Qt+aOvYOoNk7H9B3+Doou+iHFXTUBRDl/HMex54j9x4IGl8CZdi2Ef+0MMH1eDJACgHcdevg87f7oTtX/3BYwfWQWgFQce+Tb2/PpNZDIlSEy7EsM+/kGMGFePpIK7a+0jWP7X//Eu4HQFav7sOxg/eie2/MuPcHrr8e77wy/GqM99GsMmVODISz/H7vueR8Yfgsq7/hSTrxyH06/+Ejt/+hA6GnOMRqLqz7+IKZdPQipxZg/2LcWKv/hndJxuAerHo/yuz2DqpVO7v60MwOvaibWf/ib8K/4UE++cizIAJ577Nt7511fetXdlPQb95b9j4owKdO58Eqv/7iFUf/Y7mDS7JtT+udRcl7rM4Ymqr7PhsfU7tmdMaQ0xyVAppTLVA9iFJGupZtWUzKmmR7/mCrBJPndtwqjLpHTQGwYTFtvJUjefLDraWtHa3onMmeFEsgglJWmki5I9fzmftKefQVtrG9o6u5D1czwTKCpOo7SkuNdXzf1MB5qaW9GZzaLxdAs6fR9+pg2NjSeRaU8B8JAuK0d5cQqeR8vT9zL3TredbmPP84CiCgwqL4aHZrR2dAAo7WO/7rV+jz26ziiVSKaQTpegpDgJj8DxrqwsOtvbum2Z9c/g85BMFaGkNI10MtG34ct24PSpVvjFpagoLTZ/PT/biZOnWuAVpVFeVtJnbs+2+D662lrQ1NaJbFcLTrd2wvd9dLY24XhjIxIeAK8IFRWlKO7DJIv2tla0dXTvqX9mT1NFRSgtSSOVsPs+d/LpGm+2B0idbKea1HwOFzduW1souS1OeXp+0udKm2SXudR8vUE0jbvoF4QKff9M8aZemyjoQZiEbHEv0UElk+5hiLO7LYdwRI1z+VMdN+VSEw9pX+Maxypv/Z7J3031QbLPHC/THA471WNxNrXJyxzajBMtpZj2vX/HEO8lLP3YnyL5swcxdXobTr+1FKcuaOte23oMJ5atQbYtCySacHrN6zj01NvYuHgBJqaPo3HFBhS/54a++9NxGieXvIx9z9+P9IKrMWHGECSTWbTtXYsjK0djXC9cnWhc/TL8yk+B/gtSFZhwz3+gcfX9WP8XT6Hq69/GjAvGIVWawd49a3CkeQ7m/+hzqEl4QEk5isqTOHb/P2PrU2WY8o1/RdWh32DNV+9F6U8+hyF3/RkG3X4H3vrEdUhc9iPMuHsBymsrcPz+v8O2Z6ow9f/9KyoOPoq1X/0Ryn78OQwtp23b0x9przpR47Z4kPB1oT59aeMuHNt7EpN+8ihGlb2BNz96DzaOeRyzz2tH05q3cHziB3HlV27sXltehQT2o3Hlq0iP+mNkc5gyp7D31/+EzRtqMONb34P/9q+x4TvfRfIrX8GwUeVAyxEcf2EJDr64cc0AACAASURBVLz6GE6/eQfGjZwJDxm07FiB46krMf9fPoDWF+7F5n/8IYq/8UUMbSjr0Tc19XrM++Fk7PzuX2N7xxW4+Mt/gLLBg9C5/XWceL0R6b/9DubMrAeSaSSrKtC18T6s/uajGPWtezGqbj3W/N9vYvf4n2PcBR/AzGk3YdsPFmH/W1/GjP+6BfVVVUgq/bvffBDHVq/BkB8vwdjSN7D+r/8aqxP/hvMvGwzAR+uGJ7Fv1XJ4xx9E3Q2zUVrroXrRn2De2Mux5W+/hINTPoMFH7sa6foy+H4b9j15Lw6t2IXmR97EkJlXo9Kh/Ljkbpe+NOwzo06cLFvuVOeb5kn7Dtvzo1ReSi1YUmNw84KsDfLATsmPornlcOXe28YlYyB4UXgybSewdctWrHzrLbyxaR8aW7sAJFFRNwwz587GvJlTMXNcA0pTCU2ej5bGI9ixZRNeW7YCa3YdRXNHBj6AVGkZRo+bgQvmzcTsqWMxtKr7n99r2rUc/3b/U3jnUDvQ/RgNb+9r+MbfLT1zXYZL/uAu3LVwPNJJoU2cbOMj6/sAPCQS9N8c8LqasGXTZqxeuRJvbNiFY80d8D0PpTXDMG3mLFwwYwpmTRmG8lRfXNmOU9i9YydWrngLr6/bgeNNnej0gUQqjbqhIzH3vDmYPX0Kpo+oRkp5SD1xdCW+/81H0bXgJvzJ+xZhRIXB506uw7f/9lEUT1uIj9x5A8aV9Zqa23Z4Xhs2v/w4/vPplTjW9e7gjmd/gS89c4ZfxTR8+rO34MKR1T12zLQexbo1m7By9dtYu/UgGlszyMBDKl2GwaMn4KJ5MzFnxlSMqU0bv70h9VVb7Nke5F1zAfc+x0tPplxTrxOnky2HuOQpiTxXkuY3F7zUuOvBjI4pN5ebT+UJtcGzyQljT5c9pOwQ5f4FkScdk1yHoVyscfusj1MNv0o23Tm/cPUX0zqXJtA07nLfFH+mpo+TEdQe0pyfu0f1hkH8zcUnXXKdTqKDs+I0iuoHo6R6LIpaTqGrMwt1eh/9zrwWzU/i4A8eRN2fjFcn95rb0bgLh/YeQ91dN+D00hVovPsK1Cd5KGZKoKhmMIrrKpEoSiNZOwjFdZXw0NI9fGo3Tr3+GrJeLdKz56K6ykM2nYTXehAt23ejYs6HsOi+aiQAeF41UpWdSKSTSFTWoXhwNZK+D78kCa/1AJp37Eb5nLuw6L+rkHSwtes4dW3LGSo/2xyd+shLFSNVPxglg0cj3dmCzo53vxPh79uE48tqgPKhqDhvDkpL+/LqbNyHE68eQdmi21A3diyyxYtR9eS/4OC6vWgYNQkdBzbhaEsxBn/kMjQ++TpOvX8mqnNtbboSxcNGo+6yq7H/v36CPdtO9xwAeJ4HFJch3TAIqbISeKlKFNc3oKgkie5/VPs0Ota8ieOnq5AYPQU1M6bDQxESyVa0bd+M1qHn4YIHrz/zwVEFkiUVSFUk4aWrUTS4HsUg9sNLIFk3GNVTLsOg+f+CXa+vRmbxNUhlTmLPbx+Bd/snUbH/aZxcfxDDLh2OREkViuvrkCwphldRjeJBg1BUBGRObsLRR4tQ9fGPouO536Lx0BWoGkb9AXC+z5L2Mv1ZJ021MKgsPce6YFLrh4tuubGUekNvzLhXXTgHTBWkK0edlFPFUJ2fu6aaYwoThV+XZdJX560b1WT8XuO9b/YpGDqOzlMH8MZrL+Cx5zegpXwoZl1wCYZVpuH5XWg8sBurlz2Dlas34qrrbsItF41QvkKURdOx3Xj5iSfxzOr9KB46AQsWz0RFcRIJ+GhvOoEtG9bj4Qc2YdXsBfjD2xdjbEURiutG47LLr8KMpi40HduLlSs24kj5eNxw0XiUpBIAijByTG2v00OKTCfBnN/4vg+vvRH7TrUBiRLUVpf02a9s6xGsWrYEDz+9AidLGjB97gJcUl2CBLpw+sh+rFv1An62ch2uuPG9eP8lY1GiyPHbGrFm+Yt45OlVOOLVYc7shVhY3f0JfWd7Cw7s2orXn/ot3lo1CbfefisWj6/S8PKfLksCta9FijB40ixcl2xAa2cH9u3YiLc3HUTV1AW4dEJ3oUZ6EEZWlQB+9zcVMqf34pWXnsejL25B0ZAxmH3RZagrLwLgo72pETu3bcETD27Eqm2X4vbrL8eMwek+WKkYUPeCiw19v1zj3XRSaYodbg3VAEh4WmNUyX06H9NJrmSezb46Dk43ib5U7sr5qim/muzCvXLrqT2nCqduc5M+nHxOD4kPUPZRMVDvOTtxupr043zZFENSPBI7SWKf04nSy4bDtLe6bra8YOsbKH1MGGy6crqpupv8i+OhzjPxptZIck4UvsnlFkomZQdOvi2XmPCaahSFSdc1s20N9v3TX+Fkdgs6Z78Pg8aVwfeP9+anYjnzmr7hY6jZ9gR2vdjd1xUr83PUufVNnNxTh0l/cQv2//H3sGfPn6JuotebUQ/mXgqf+Vaf5Ztrvv/uiUTLYbRsXI+sNxwVo6aiahxQe8XdGHfg1zjw2L3Y91AlRt11D8ZcPg4lZ5aq5AGovfLDGHfoARz4zb9j34PVGH33PRi9eCzSmm0lvmHETczrwWHJS6a16hh1rfPJHtyBQ//8V2hL7MTpEVdi2pQKAN2/o/CP7cGpjVVAbQeKpkxHSWkvIYDnwc90IdtRjOLycnhJIFlchuKuOnQ1Z+Fnu9C2bgVaWoZh+offi9a7f4p9Bz6CquG98SYSJUh4p9F5OtMLo5la0bnjHZxqK0cqVYvKqdNRMuUaTP3kQexbch9Wv5xCw6UfxPg7r0KVfuDk+5a/65WAl07AbzyNdt8Hjm7AiZdrUPc316J++Tbsf2MNWhYMR2WRp3fEALI4teEVnKqdinFXX46j21/FyXX70DlsLIo0+1O9AJezJPffVc+cN7n5OrnkQ4qPBBulk0Q3kwxKlqSupdQLHQwFkgJNkT7GXXMBzd3neFByKH04PKpM2zyTfHK89012MzzPQ7b1GJYveQYPv/gOMsMX4JO3XoRxQ+pRlU4ByKD1VCMu2LQcjzy9DC88+VvUDLobV0/s/scD/a4ObH3rOTz19kEMXXAVbr10DsYNqUY6lYAHH13trTg8dyJeePZFvPr2q3igbgS+ePM0pGtH4eJFowBkcGjzm9izZiOOVI/F1Vdejpoy/RRPvue28W79szi0ZTPeOXQc6ZFXYt7Qop6i6Hke0NGIlUtfwoPPrEZLw2x8+LbLMGn4IFSXpOAhi/amU1i4YxUefexVvPz0k6io+gPcOLv+zM8BMjiwez2eevptHCydjo9/YDGmjhyMypIiJDwg09mBU41zsW7pi/jN0g343e+eR8NHb8H0Xt9d8nq92nTso7N27ftJNEyYgfdMmAF0NmHFi0exdtMh1E+ej5uuGoNkny9AtGDT8jfw5CvvoGL61bjrhtkYM6gGZcUpAD66Olpx4uh+LH/6t3h41Wt4orwKNTcuxIhScyyY7ttil9RTwDcK+ZxO0rzEyeXyQVAdJLiDyKIKF8XbNC+MfcLk/rB2s41JMEjnhJUj0UHqB9R6rjYG2SdX31SbNxNfGx6pfBNfjo90nq3HMeGQ5gXJe72pC+MbtrGg+kvjw+YXUh918Q/THMpfEzUNqLhgEeq8Euz/yRtoOtAKL/fPM6Gzr065NyXDMfbOy7Dqa/+Ktl3zUU7IPLLsEbQu2YEdX16Ntu0r0f7iFmQmTdYYEbp4HvnNSWpeD41ejNFf/ipqlcYhWz8V4z71ZQw5sAunnvsBVv/9P6Bk5r0Y09B7KQD4nofUoGk9808++32s+ft/RHrGv2FMQ++5QeLMlqdMY9K8aTsM0nF45dUon78IdelqHHr7eZze3QKvtnsssfA2TPmL23rmZlqOqQC6X5IpJIpb0d50Gn7GR7ajBe2pYyiqSMDv7MDRNx5H69ON2LL9WTQf2IziJTuR+YOhvTBns23I+lUoqkxa7fEujUDVRz+PyXMG9czPog4j7vgM6i/fi6ZVv8Wqb3wLyQsuxMxpFb15Kr5FUxbZ9iy8miqUeBmc2Pgymg4sR/Zrn0bz8T1omVWNthNXoKKhuC+frpNofGUVWt9+DXs+uxRtew8hXbMKrZeNRVHaLee79jImvtxc7l7uvsthkiSXSeuFKt9EkvoqtY/133iTJneVbApwp3+2ZkEWJDIMlHz9fdRydBl9E1kX9m1fhadffAetNXPxqbuuwpwxQ1CVTsLzAM9Loqy6HlPPvwqfuH4+KloPYMlzr2F3RzeGjvbjWPnWVrQPmYzrFs7D1OE13Z/g+z5w5uviwybMwa03LsbU4SnsfmsFNncG18NV355rANlsBu1tp7Fj3eu4//GlONAxDO9//wI0FCsT/QwObtuAF19ZhePFY3H3h2/C+eOHoba0CAnPg+clUVJZi3EzL8Un77gY1W378dqSpdh08syv6TpasXfLOmw5WYpLrr0Y8yYMR3VpEXJnmMmiYtQ2jMTFN96A62cMw8n97+DtTcdgozC2cvUvnDyENVt34lh7Ha6/7VJMGzEI5enUGX/wUJQuw+ARE3DNhz6ABdUd2LZ5C3YebAqMTyeJrmF9Jx8yzhWS+o+znzlSvvcjSB2KivKhq2sM5FN/ncLKLrRY5nzL9EmLlKS6xinD981/dV0SW4W2Zy5ENtr1w1C9+DoMveNWpI+sx8ktB+GjAVW3zkDH0iU4uGM79r75OtonTELtoN4fp1ZNvRFjFo5CZu+RvsI6N2HvK0cw8ie/w8JfPoRFD38N7f/1MPafOtOTtDWifc9utOzehdYTp5HNAshmkDlxEG27d6Fl9y60dzjYuu0k2nL8jp1ENuPjyMNfxxvfexwt2XKUDBsOrwPIdjLrfR+HH/x/ePNffocWvxylZ+b7Xcz8PsvN38Tq8/Adg29JZKhzvMo6VFx6HYbedgsq2nfh+IY9736qffIoWs7sQ+vJ5u6/n5XpRNexA2jdvQste/bALx+J+itHonXTszi66R0ce+UFNFXNxPBZo5BoXoMDm1IY9x+P4aJfPIKFP/40Tv/iMRxpOiOh5TjadmzG7uefQvP0mRgzqcpB03Z0HdyL1j270bL/CDrbu9C+8n+w9GPfw6HGBEoahiCZaAMyCXk+yWbQdWAXjr/xLI6+PQh1i+Yi0X4Ujc9tBD70LSz85f2Y9/Pvo77sIPZv2osMcYzQcXQHGt9Jo+Gb/4Xzf3U/5n7nT5A5+CKa958U/2tiJoq79pt8mJIdRL7LM3E+e51e/wqA7esH1EmM6bTc9NUF09fJXMa5MR1DkGLuag/q6082eSrWbEcTNi59Dbuytbju6oswqa4coE6/kikMueBiLHx1FZ49vANbdrVh1MQSwM8g05FFSVUFykpK3p3fy04eykaPx6J581B1OIGiDgBFxGGEQF/1Xh8H72zEpnUbcCJN/EMTfhfaWk9j26ZVWLHxBKpGTsIdt1+NS4aWv/s1K99Htq0Zm1e+jk2nS3H+be/BnEFlZx7eNXskUqiaeimumfA67t+/D7t2n8CUWfXdv2/r6kTGK0N9RQlyfyOvtw4ekkWDcNFF52Fr4ggGl3A+3S2X9Ut9dm7/ift97dX3K9M5nH4mg0wmAz9Ri8GV3X/osC8+D6n0SFx55flo21+FqlRfPiRvQezammHX+Kdi1xZDNnm2e5yPmvKIdNyEz5bLosBPkatcTl/1nj5ukyfFZdJXOk4Vzyj4RWUPWw2S+gxXh3SS1lAOg0kHkzz9HmVDSU6R2tB0z2SHHEl81YaLmq++l9qfkiPVicKmrqXsZcPiku+DyJDkN5NtJPvO6ZIaPgNDL25AaYkPLzEKwz7xHvjlKWT8Uoz9xHfR9fMfYs/fPAMMW4Dx3/wQhpcWAV2VqDr/MmDcICTLh2LoBz+P1tMrUFFf2uufPPaOHkPFhD/CkHkTkW7wUFxxM4ZeeC/QmEXpmHkYMvh57P3LL2IvgOIbP47Jd1yKutkXonHNL7DlS78AANT/3QOYMD7VC39R1RjUX7YA5bUlZ+4lUTZ2PoY2vIQ9X/kC9gBIXnEnpn7ovai/9hNoaf0ldv/tb+CXjcXEH3wLo4fn7JJG/UXXwhtXi9yxRv31n0Dro7/E7r95FH75OEz6wTcxaliw3t+0JzmS7LUpztS9lK7tyT11EzD0iktRXgbAG4Yhn7gOzZVFyKAElecvQsPSZ7DuS88AANIf+DwmXzsJdTNn4vSyn2LzMsArKUPDt36JMbd9Hn7Fr3DgH/8GmHgVpn7udjQML4W/9TSqpv0hGmZNQLoOSC54LwYvfRz+KR/lExdi0Orl2PVXa+FNWYzJ99yB+rqSPpiRKEH59AsxpGsMkmf+plWycgTqFw9H039+E+sAYNhFGPHZj2PorPdh0p3/jX3f/xqOdFVj8Nf+A5NnlvXwq5h0NRqyI+jf/1cMR8OCi9Dx7/dga91YVH/x65h8UT0yzbuRHHIxRs5fhNIhDUhWz8XI87bgeEsHkAX84gpUnrcIDaOGIuH5aG9rRtHC6Rh+8XSUNlQhMfdyjNjmob2jvadbt8Ust7dB6i53zfkJ10uoWCR5zZSnTbXUVKd1faOo6b308zWNJcVJQtIiZ2sugvCVzA3Cx0WnXnR4LX74q8ew9tBofOHbd2MSM7ftxHp8/1u/wK5hF+CPP3gjZg0vNX5tZ92j38N3lvm49n0fwG2XjARajuG3//7PePLYMNx0x/txw5xhKPL4A4y+1P0TgJ//x2+wseFKfO8zVxI/ATDr2nZ4Cx749X14aUv3H6nx4QM+n7CLqoZi8TU34uaFE1FR1DsYWxp34BffvRfLi2bi0x+5GfNHVfeyhy5/5/P34huPn8IVt9yC2xdPQllXC1a/8gh+/OgWjLz8ZnzmfeehOtX7Sy+mIDp+6HXljwBeihEVrCmA42/jL7U/Auj7PrzGbfjvBx7Gc+urcM93P4VZRcqnCZ1NWPHio/jZ4+sw8ubP4MvETwD81v147IGH8cSKRlz+kU/i9vlDe36bJ6F8xkCQ3GF68ACCfSMnKD9Xe0SJT7JG2oRJcQD2Bl/KX+cnKXaueE0PZBLekgepqPmpcwG5/9nwudoxCvtJ+QH2A0YpnQ38+sufo5IZdK60Fkhzpe/7WHbTdTj/l/ehuK5ehFNCUfe0/cEvin46qpwRlJ++7u1PfhQT//weVM2cBQB4+xMfwcTPfxFVM2YG4sfdz+czTZTrglCYHiwqv5GsC+L71NyXFp6Py5ctjxxr1LEpnevSbwXpy3Tq8/FsEOdR1+WASRwp995FpotxTBiC8JGsCaNL17Hd2N2WRMOQOtRUl7CfHueorKIEyDSho7MDGQDpdBXmXroAax5aihcefxgnDizCNZfMxLDqop7fekSZiPQA6XWWVD4JH/qDizGkhP7zt9mOVuzduhFLlq/HGy/8DoePLsbH3zsXVcXvzu9o2o+9jT5qZw3FoMqKPvbQdSktLQEyx9DR2d79b90mSzBuymzMHbcTb7z+LH7adgRXLF6IGcOrkU7En5ijSEReySAsPH8aVm19GUt/+xBaDszH5QvnYlxdKVIC9iYMUcedibgEq/MNkhNMZOIXptkOio/TlyLVRlL7BcURBJ8+r1f8a+vzgTfI/pnw2fi51DLX2iHB50JcMxPG/6n4kdR9lyYo6P6acOvvwxxSReXPLv4XFG/U+Y3DYPKzqPDpZLJBVA810loShJ/tYUkiK4oc5DI/SPzE0XPZcluUcoKuk+xvJP1iAB5R+426Lqivhpkb5IGcq2P5zqu2cdc+wDaP+H62G+UMrjerqnDukCBHVADYTpBdE75kLOhcWwCzXw/Xm4CmU2j2Mmhd8QK+vfZVGP5ZdwBAprMNQN27eJMpjJt/FT5dU4ffPvU61i19AiuX/A4lFXUYO2kSzp8xA2OHV6GitBQlxSkkvPAJWQ24XnxSVRg/eSLGlxezhwQzpk/Dgvkz8fhvnsDSJY/iZ5V1+Ow145D7zkG2pRnNvodT61/GP2x9DUkLzGxnO9DzZ3kAeAlUDpuBOz9ag5FPPoMXNy7Hz9e9CRSVYdjwUZh74RxMHz0UNaWlKC8tRoI0uLn4Rn2q3mfMK8bgaYvxhT8biQd+9Tg2vP481i19Fl66GpOnTsasOdMwfnAdqstLz/xtALe9dI1F/VqdL4l9an2UhTrIQ4y6LmzuCrKeuzY9rAR50JJg5x5MqPkSvNx1VGTyJR2v3hzo2F3tlU+i7Onqa9Q9U93W55vGXZq8sE0QR2H7CKoZdOUXlIL0JVzzSmGL25epPsCEz4RJgk8S2/r6sLXbRGH5mPDno8cOi910LR1TySV35fia7Efxd8ETlkz1Wt9fdUyfS62Nglx7B9Nalai6Sq3PzZXK0+frMqUURZ/imltdx6lcENW+9/kbAEE3Wb/WHdo233WOxFnVgmIKQI5MG6XKMMn2vL5/fZNNbD4AJFFVNwSjh9WA//K9QkVVGD2o/Mwn/B68RBrDJi/EH0+Yh31b12Hpqi043NiM07vW4b7lL6MtWYc58y/EgnnTMH10PdJJFbu7HUz31bXU3FRRGvVjZ+Cma0/iwAPPYNuSl7Bx0TjMLlPW+QlU1DVgzNA6FFv/ZCUAlGHs4Koex/YSSZTUjML1f/QJXHZoO958ay22HT6Fk83H8PIj9+PhVg8jJ8/BpefPwnkzx6M2ndAw035nS8Am3++xp3RdIoXKwVPx8T8fjyM7N+Gt1Vuw53gTGvdtwmMrl+KkX45pcy7AlQtmYdKYIShnjvUo3q6xyMUV9yBIkc7PhE+XZWoaubUuDQnHWx83Fa1c7rPJ5uRzuYUiUxNEXZtk20jfe5WHpHYEKVy2NZQvSeVIY4GyKTVfnetSS/U1VA1R5+bucb5jwk/po2NQr002YusYgdUWp7ZmiFur81Dx6yTpM1woaFNr8xGJf1HjtjwteSiS9FXUNVdbJHhNdYl7sA1Sdyj+JpI06kHyGcdT11kf0w8BuPUUf329K9l6aWq+S5zrxOURfQ63/1QuMI1LegfXh2IKM7eW0jeIb7vkWQl/U44KupYak+QGW88dFoM+pmIx1TZbHdZJMk7JsWG2jVNjKdOget+1UEkbJQlQW9BxDmJKqBwuKXEF3OTUOWL1SyTg+yUYP/cS3PneeagNgyuZxogp8/GBKfOQ6WzDqaOHsXXXbuzetQsrVzyLn73zDm645VZcN7VWsRfPMyjZi0ACgyZMwNQhtdi9+yC27m3D7Mkl3XMSgOelMGLWRbjzhgUYzPz4XepL5UPG44qbxuOKbAbNTSewZ/sO7Ni7HxvXb8QDD2zG9sPX49arZ6NO8N16m02CNQ3mAzMvWYzBE2bjxgmzgWwXjh3Zjz0792LP/j14e8Ur+OnW7bjmxmtx1XljUJ60J9koH8j0eKAaNR2DDR91X1qAbTw5MhU2SdHmZHJ51JZDdLIVQ9u1656b9k9CtkYhyEOQaZ26xrVR4NaYGk2bbNODUe69vsYkJ0gulsQYh98m22YXaky3tcSelDx9Hhef0qZJ0si55B8uFm16c7hdmztbrnAlae52fXCJMt+Z7rvkwjCNdpA1trpD3bfxde2jqTGujtsoKlvbdA9qz5xOXIy51oEwzyz6fNcex4SRGsu9l/Qprnan5thiUZpDg9jFJT9Lx9Rx0+FUUFw5vlHkbJvMhGmQuq83ulRhN/GUNJJRKq3zkyaw3Dqb/tIxZRI7lqiuQY3Xiea2VrR1cMt5/LRtPSSLSlE7bAwuuGgRbr75Ztx13fmobd6BZ3/3Ara1uxexIGNGKq7AkIpiwM+itbW953ayohpV6ERTcwc6uH/GBuaDHnKPEkmUVw3C1Lnn49rrrsXdH7wO5zdksXzJC3hl47v/DKCHBBIAsl3ZXqey8ZHDXiRSqB8yGnMvWogbbrwRn7j7atSd2oHnX1qGTfu7/xlAU/xx4xzpettsTSVEvaF2SeCU/LBJ1nWNbSzIWumaqPyukPSzrXOtLRKSypOui0ueTkEb7yBjrjXSdcymu/TTEdOYtMGkxqU5Kq4eJkhTGQYL9SlTnPJs8qPgKaEgD6Rh8ASNv7hri4lcH2yA3vg533LBGaeto3pwi2pvpXUurlgJ88AvoXz0MXFgKJQ6HkVeUjEk9Acb3/fZhx0qsG1CKL4mfkHncxhM86gxCoc6picyCQ8bthylGiZjck0n9u8/jCMnuv8JDd0eerJQx7vaTuPI8ZNoauvqtbaHPA+pkkpMvuQiXDB6CNqOvIN1uzoVfgo+QhdKPmUbdb2us/6++9VDMuH1+ud0AKCkbCymjk7g4N59OH7yNHR1KGzqvUymHSeOHceJpjZ0Zan98+Al0xg0ajbev3gc/NaT2LZxJxrP8ChK1mBwtY+TjU1oa+9g/5YDAGS7OpEFoZ+2RtqMdb/PoqOtGcePHcfJti74PhUfHpLFFRgx6WK8d0EtTu3fj237j6KNiSeT//SVz39FjsbL5xC1EZDGnS7flBOoMQlf3Rau8Rx1fpPaTbeHDTc3jxuT3pPo58qDsyHHg5Nv4hV2P2wyJPvB6cLx4vBGvR+mQzepPUz+Zptvi3UJvzB4bTmK0ysqvJR8ij+HQ4o3R9SDf1j9XOIpTn8LgpfCE6e/6a8S+fncD9e8oh/028Z0Ga54g8y3ybTpHtTfgsji7nE8bLrq8R2lLJvOFH+JDfMZ/xL9gtrD1re57Ac3ZuOrxnefbwBwyScHPqeAqgg1l+Krn5ZQxlCdkzqdoxphnZ8uWydVH91gun4mvJR+pC0J+dTJUVHxEMw/bxQ6d27CsrVb0dyZJedTwex5Hg699SC+9K0f4aHXdqA12zuRq/p5XhpVpSl4XhZtXR3aWBJJ5Tfkpv3QedtIxdPb9n3n+b6P4tJKTJ8zBemDm/H8ym1oymR7+RyFTX1tOrERP/rWP+AfHnwN+5syJF7P8wAvgYrSUnjwux/kz/BIp+swHLwuKQAAIABJREFUfHgpWg7sxd5TTfD93j7QIz/biu2rN+JYNseX+E0ZYTckPCRSyXeDEHoh7cTOtS/jn/72n/D953fAV/j28R8vicrSEvjZDDLZDHzBSSDlg5xNufjojde8H1ysq/7AxZM6R/cfThc9jnU/tX0SQPk2lTso0hOvnms4rDoezkZcYVFlq7q74KXkczg5G1G1QoLXxlcl3R84bFwt023K+Qjlnza8Jv1sdYnCwK01+Seln64TW7Msttfvcf6rzuN42HzbhMNkS1N8q/d0fCa8+n0pXs6+nE1MeYvyE1s8cfpxOppiV8/jun6mfoDyQZVfsrQUmZYW0T5L8j1nI0k82Woht47DSNVAEw+bf1J4c/dM9VSdz9VpfZ5LnVZxcjky29EBL5kEEometYmSUmRaW0n9bPlKf8/NV3Go9uJqkM6Pqq3cfnL7wdlX50vZlMJG2YGKAWo/TPtH4aVqC+UXlE30nsAkg/M3lTKtLUiWlZH6cXamKEi+ktZTVR/Olvp8l3jS56v3bXXM8zwkuMSqK8MBpOZRyUYHrSugOwe3nsKjj+m8TZht+unY9fWm4t/DrzdAFnsiVYwpFy3CnOGdWP7ii3hhzWFkCBzd1504tGMNlm852fOwVzNuKobjJDauX4etR5qRex5Vbev7nTi0fRNW7j4GFA/BxFHlii4e0iUVKK9IwjvdiGPZLGkf3W5kcSE1pG3teUUoPvPH91pbOt69X1SC8bMvwoVj09jwyot46u19aGf2D8ji2K51WL7hEHI/IihND8Xk8RU4sm0D3tpyEBmf3v/Ok3vxwvIdyKaKMWjMGFSeuZ8qLcXoKZNR2boXL72xGacIe3jZduxe/yYeXXsUZdm+2nvaa69En0iirLwSFQngxLFGTR/A94sweNBQDB1chD0rXsOqQ8zvQgC0H96E51YdRrquDkPr65HWeEliinpvGqcSleprJjlSXNQ6G1abLGoNl3dMeVBP4FROMeUaSc6heNv4qPY34aVwmmRJdJTUCuoeVay5ubYcL5FnsjWFnSOqhuXum2qFRD+bbwfRj9KTai5NulC6UTahcHJ7ZNNNvc/pxt2jGigbRk6+jsOkC2cf6XzTvkr8jZNn088k37Se043yLyp3ep6HmvMvxIm33mLtZ7MnhVvF4LIfpvm29RI53J6acqHU/iqZHgSoe5QOJl82YeXut+zahaLaOqQqK3vmVM2ahVNr11h904Q5N26yv/rKxQ23n6Z7EvvY5Om6cFhs/mqb6xK73D1dpqm+ccTZlcsfKr8Tb72J2vMvdIpd00ESdU+Vb4ptLtfZ4oDjY5uv5grq0EaaK5Jf//rXv04ZSEIuc1Vw+nsu0Dl5XIPCyZFitulj2zAVWy9qPoy31ryDw83VuPjqOajn5Hke0mU1GFLlY/eWDVi1aScON/uoqa1BZUn3P9vX1dGCg3s34bmnnsf/vrwCe5qrMWPmCJR6QLKsGuXt+7Fi5WZs3rEbRzvKMGxIDUqKkvAAdLYcwbplr+I3zyzDpkOtmHjlLbhxRn3PvzbgeR6K0Ia9u7djy879OJ4YhlkTByOdyKKjI4NEorcTUSdSmZbjWL9uLXY2N2DxpVNRW5xk7fkuJdG2dz2WbmtE9dApmDepDt2rPBSXVmForYc9Wzbh7Y07ceB0Fypqa1FbVoyEB2QzbTi+ZwteePZ5PP7iW9h5qhiTpo9DVQpIpNKoKM5i94Y1WL11F3YfbUdVXR2qS4uQTHjItDdj3+bVePKp5/HShgMoGXkh7rhhDgad+ecGvEQK5SVJHNm7Fes37cSB00kMG96AinQREl4Gp4/sxWvPP4fHXtmOEQunwX9nLzINozB39iTUnjGq33Yca9dvxPYjaSy8dj6GJNV/yiABr+Uktm59Bzv3HkbpuGkYX1+KRKYLHVkgmUggXV6Bktaj2LhpA9Zu24ejzVnU1FSjoqQICfjoaD6BratexyP/+yLePpDFpHmLcM2F41Ah+EOGKlF+a4sH2wOwTupcjneY+JTM5e5TmKRNRBAcrmTCbXvPzQ8iL6o1UlvbKE59wsiXFHfuE5m4SOJDuWvTpy+cHpK6bMPiQpJGX33v6m9S/K68bLkpiF2i9pso+0CusaZ8P90wGLt//jMk02mkGwYjWVJCytPX2zBFaR+XfQ/D30Su8SN94KA+4Y2SfN/H6fXrsPfB+1E+dhxqL1yARFF3s1RcX4+9//NrwPe79760NFAds+GO0i8kdopDXpz7Y8Jr6vOC5H1X+wFAV3Mzji1bij33/zdG3Xk3SkeMCKwPdy/InLAyJETp41ozetUuXzuy4AqV5H3Y9RJniJJn3vAdXosf/uoxrD00Gl/49t2YaOHvZ7twct8mPPToM1h3sAldmSx6dsnzkEgmkEoVY/DkBbjzfRdjREUREl73+mxbI1a/9iKeeG0jDjd1nvlbALm1gOclUJyuxfQrr8YdCyahOp3sjcPvwv7VS3DfEy9jy7EuJFNJJDwgUTcXX/w/N2B0ebFR77bDW/DAr+/DS4en4a//8v0Yr8w32a9z2wv46o9fRPGYC/Dhu27ApMoUoNij5fgOPPLr3+Ht/afRqdjD8wAvkURRKoW6MfPwgduuxISaInT/64Y+splOHNm6HI/87+t45/BpdGV9oPu/M+s9JFNpVI09H3/8R5dheHkx1Ed0P5vBqd2r8OvfvIz1+xvRBQ9etyGRTKaQLh+ECxdfiWsvTOMXX/0JjkxeiI/ceT3GlZ3Z0xNbcd8DD+O59VW457ufwqyi3gcifscJLHvmKTz26gacyHgoSiTgeQkMXng7/u/N07r3tasVu1e9gP/83WqcaO9E1vfh+2oSSCBVXIKJF92ID107FTVnDnxc/Vj6wB9HrHD3Te+7dZfrFFV+CcNfKtt1fpD3gL0wufpKVPk/yMNjVHsdhqcUq0RG3LU0CNY4cAeh/vS/uLGGmeMyFgWOqPcUvo/TmzZh7wP34fjry9B16lRgfgNUeOR5QMX0GRj+vlswaPEVSFVWvus/2Sxa9uzBnl/9HMeWLkHniRP9jHaACpGSZWWoPf8CDL/tDtTMm49E6t3fLA88v7rx8rLZrK839ZQggP+qB9VM2oxM8aOuJQ8dnGwJBk6Oy8MQJb8X31N78PSry7H7ZD1u+tBiDDXIUNdmM83YsW4dlm/cgRMtXcjCQ6K4FIOGj8LsWVMxob4CyQTFJ4v2xkNYsXIttu47juaO7j8KmEyXYdjICZg/ZwqG1ZQgwdohgxO71uOFNzbhUFMnvGQKlXWT8J5r5mDImU/0Vd1V/TtOHsCy15Zg/cmRuP2WCzA4nWL3UyXPa8Gbjz+B5acrMO+iBbhgfC2S2t5lu1qx5511WLFuJw43tyMLD8lkGrVDR2L2rBmYPKwCCcZHkWnG5jVrsGbLHhxv7kCXD3heEarrh2P63BmYPqIWxcm+PtODu+0U1ry5FCt3nUBLZxZIFGPw8LGYN282xg4qQQJNeO3hJ7C3ejIuv/Q8NBSf0bPpIJYsex1r95Thpg+/B6OTib72yDRjy4oVeHXjXrRlgWRRGRqmz8f7542Cp8zraD6C9avX4Z3dh3GytatH/7phYzFv/nSMryvt46euMUut09/33TvG5qCTDpd0dbv0spEwoZkwUntLYXWKbYavKb5N+CRYbXvH8ZXIk+wxZyOTThwfHb+pJpj2gbOHCav0HqWTbS1FXH1U8UqwuGKQ8qFsKY0Jbr5+T7eFrQaG2TvOrhwGW84w8bPZg1pL6R/Gp3QZnC7SPKPik+RTE2+TbUx5VJen6+ySqyndOH6cLYP4gmmcs40Lfh1D1Htni2lbjTP5umsOdtFdOm7bO/0+pQtFQfxbYnOON2cfSbxR2ClcJtvY9pOKO9c6Rsnm4orT11SPTGt1eToG172jbK3Lp+ZLbG3D1YPd17SROLaJJEnONC6VISkscVIUMqKwdVg7czxsydsm3xWjKcmYZNgw2JKda1EOg8GF8uHDLvLi0PFcJBc7nMs2i1u3IP4Y9d6cDfsXRA/bddQY8jEOBK8j/VUDXPkD4WplFBjOhjoHnH120tcD4XqWKPG48g8jzyVXRfEsEkducsFok1GoOrrMCevPYW0Qd7xHSVHnlj4HAFGCOddpQP9wTXYQ/oXEb4DepSgO9mz8JUVGiqEQfEGKIQ6s/f2A3t/84uZfCP4lpTge3OI8kI87HuLAC0Sbl/Jt3zAPlYVQG1x5xPkQHTXeuO0bB8WVH6Pet7Mpj+eLfp9tcq7pbj0AKITkcq4ZPSgN7EXhYCgEKgR/yOHobwyFQP1th0Lxh3OB4v6ULl/U3z4ZBYaBvRjAEOX6qHiEpULBAASPjYG9OLdowB8KB0M+KKHfyDmA6gie1/t3A9R736f/TVnufEGfT/HJvVfl6/xs8im86v8uephsoONzmWsiXS7llC56UHIlmHX51D5R723Ezefe5zDY9sOkm+t8KS4Xe5j4UET5UC42bTxsfsD5p5QfhSGI/Wz3uTkS/VzsLfEt6p6eJyXYufsSPjreKHO1xCckvm3CayNJLqPkSfGa8pTEjtx71R84/iYdgu4fJcsUm677F7SeSG1poiA5VJWvf7qrvpfEhUtN4/CavoKq/m/j64JXvx9Vrnaxh84nbA9DfTvBNJ/aPxMGV/90jR3XuJD4vm0/OL/RY8NFD1WHsPHN4eTumTC5YtHjwiTfhadpjjSncDaQ+LzpPWczKldKbO46bsND8ZH4PJdLXfbDhFWSqyV7ZsNL8aP42/Sz8Xf6CYApebvc5+bZ+Nj4mcalPKImSp6rXcLK1hNcXCd0ujzJfgHx/j5JShI+QWXle7/DrAfsf7THdK2ul2J08U9XTK7zgs4PQv293yqPsDk8KH+bvChyf24c6N/fQsY9HqWMqGp6ULLlBBf+QXWJqvZwNrXdd5ETlkehjxcCBq6/ce17oqB89bE23bjYBPi/7cTJCIpNip1bF2WuCYs56PqwfY8tN+XTBi41KO6ePAhF2TvGVbty1POvAIQBE3Rd3MEWBZ6o5eQrcUvxRM0vHzLOVvp994coErfKF8jv13pd9i/Kh/Oo+LnIi3Juf/DrLxnnEsVlr6gfCs51XzzX/fZs3L/+pHO9j+hPGngm6V9+Uhn9iSdq6s9aEOqPABYS5fNEx3VOf2OLc/0AnX1UyD4TNo4K2Z8LGdsABaf+zP1AfH/dPqpPGYLQQKwUJhXynoc9FI4zjgvZnwsZ2+8z9ZfPFfLzTj74/z5Rn78BAHQbWP1fvc+RdJ5kfZD5EocNIkdK1KlT7n9XZ3WxpfoJoasM9as2rtjC7peUf758ifL3uOW5rI0SmyRWTPJsDwWupK4x8aZ83TUPUGsk86OIkaix6fuUD99V1wTxXRdbBtErSBwHjX1JfufqQu69K+mxEsanpA/30vVR+lLchyZBfTduOVHlGpe1Qebb1lLj0l6GWiPBGufDkgmbhPSvBMddg9Q1Nh82PcgFyaOulM81/YFRGit6fLl8KkzJseV3zhYmf5Bgs8WKxJZB8HHyJBQ0voJQGN8Nssa0LpK/AWAal96TyogDT9g1UhrAG0xOGD56I5sPu0jnRWWrOPTqT7+SrsmXfamxOPw8KvtGJTtOPDYKEssDeOW88xVPQWTr40HlFlodjMq+50JdDivnbKhPcayR8omj7wlCZ4Mvhs3T+c7jA3UwXiq0/baNh8Hb5wCgP5WzzQmLLazzFZqjulJ/4M/3fhaa/Dip0GI1ygfk/vbV/pbvMnY2yD+XYyUu+YUW39xYocVKf8vv71g9G2nAn87u/GqiOPf2bO8B+3v92Uj9vZ9h5fd37VApoT3/9yF93DbfRJRiLvI9r+/X1V3wSE/XXeQH5UVdhyVX/vmQrz8gRknUYU6hyXe5LiT5klgxzZHEqn6t8gv6iZ/LtU5h5YchV1+NI3bjlC8pimGuz0X5pv3IR+6Q+oNrXaQoTK6IguKUH0fdd/GN/u47JPLD5N6o5btSIcjvT39w7Sui9L8gzwRhenpKfpRUCD27y3V/yDf5etjcIcFn63ttFKbPino/EqZP8HLXOSGU8TkA6n3uPdD3d705edQ1JZ87VFAxu5CeEKhrilSMJt10WRQfyT0Ou7rGhl3SBOo6mfac8h2TPNPemWRL5OeubcWII1fZFL+g8jk5Lk0ptf+UfEqWZM+pe7r9KYw2+ZwsG3G5S7KOu5bmN2osiO9Qeccld3DYbLJ1fqrvmPJyUPkUFonvSuXbMEnlhyWXOuQiX+VpyhPSumHL1VzdlfiVjonDxeVOru5zvCXyKXKpVZzNOXuEzUOcTJ2/qe7a8pUEj63uSvBIYsul5zDJp/iaxtU5NjwS+dwaapyax/mUfs+1r5Tmcko+hSWIfAlRck3xRekjzTVh5JtiP6jvcDxssUbhDyqfqsNB9k7HJ/Fdae9l2ztTrTT5rpq7pDWOwmfCQ+F36WFNdVFiO0D7CYCqMOeIUZ94Rclf2jhFfdoatuAExcM5gAmPa6MZ5370N0Wtfz78z0WedI4Em6tvSeRF6RtR8FN55CsXAW5FVeqvQRpvF1k2ea5kwxs2dvLpn0HW2mpv1Dhc5BRCHdB9LUf5qC9Rx1KUeTsInqjX2/jmK3ajjKEoc2lYouSFiW0qloLm8XzX/aj7EOl60/048YTlF7bHjcPXo+wb8k35fmZwXS/Fl3uN9Z8BjCLxh1mf41GohdQ1sYeVR60H8mffsDSANz7qj0JmkidZH0WzF1e8hX2A7e/CGPVhVdx0NsVaThZwduAt9Fij1uaoUPw3qsOYfODJx/p8UtgDlzAHekEp3weQQSkK2wKyn0hFoVPYXJbvOl4IPX4+6WzE258ffLmSLj+Ru6lPCnOdI9OJmZQP1URTxPGiPjXg1rrMpa4lSUylKB/+XfZI1Vc9oc+NSdZKyWUtJVsdy+GleEn3TNfXhjGonJwsqf/qc2w+GdRHuWvKF1xxmPZPill/5dbm8Lj6r41Mc6l41a+5Aqb7gk2+7RSXu3aNX9N+U7a1reXmS/eAmheF/0qug+grwU/d5/xB4r+mmAyjP7d/tuadusftkY1PDkOYup+zLeUPtrVBa50tf5niWdc1qnylj7vUQdNaCY4wOTiMHIoktcuU2yW24mRKiOIlrftRrQ2aN3K2cambLmTrPyQYJVik+0vl7aB+JaGgfUDuOoq6GGatjZdOpj4pTI6Jcq5pf6OkOPTV4yhBFVvVYdRXCVP1fxtQzjGl90yK6zpIHm5suKj3todwHQOHWdJMUbwkOun6c40jlTA426n6U3uujuvvOV2pB2YVlxSTCYPOW8dF6WPzPxUjN4eS7zrXVlik/swVbVsusOHXD2j0ObovSJoH3bYSH9Pnmg4idQy2Q0tdX/3apL/Oj9pXyRxqfzlMqo76XO6ak2XyK25fJDFKyaP8lZNryoWcPhJ7mGxBXXM6uYxTDZCek0zjtjxp0kH3X1t91m1nqnXSB2BbQ6XHlU2OpO6r1yb9qbqgzlXlSfRQX3U+3Fxdvk0OlRukuUB/T83lcHA9pEl/6lq/Z/NnEx9uzFRTTDXVxJfzE0msULw4uVwO5mKfy5uS/VR1MNVy297qmEw9tH7ftWfQ51K+7pqvdF2oHoKzg62fsvkmlX85XpQ+LrHPrdWxmHIshdNWG1Xe0ti35Sybvtx+Ums5vNwrpQuHk3vP+RIlX98TUy7wstmszyWCIOSaWMLwC0s2flHJ0zcgKhtHzc/0PmrehcKP4x0FL4BvFKLEbcIglSOZa0qkYfm54rVR2FwTBT+bLCC6E+RC9CnJurhsbvMtKW9pbqT4xRl/tnVB+Unmnu153FWezcZx8AOi/XQpqL2j8CNJjMflD3HYMmqS5Jh85Xcbhck3LvyCzg/CDwj/LYVC2JsoKOpnnqhI6ndB6noU/CS8o+AXtV0TVMGhThtsAHPEnXCp/CV8JOul+KT8opan2zVIYrLh4k6BJHyo5Me9D0phGhoOexwPTxw/if30e7kg5fDF8SAZliSYdN8wrZGcmurrKV9WyWUvwiZtKb+g9rfZT0J63g2DSzo/KGYOXxCbB5Fnu9YpSG4ME4uu8Wdb58JPgjuKusD5q6lnkOJTybWu2+REnccl/KLqFXLjQXkH9UvpOHWAEmV9jDrPxkGSHGN76HUhW6wF4defPY2pDubGTbEdti+19S2u/ML6W5CeNUdR1TWTTYLkelPOVPfXVkts+Ch+Nny2vsWEL0hti7RW+nFntwEaoAE6J8h2Ohr2eoAGaIAGaIAGaIDyQ1HV6IHaP0ADdPZRIvfG9GmrfmLBneior9Q6ag0nUzKPW6fK5r7NYNJJOkbxN8kzyTBhM/HhSLJvprGosKr8o7CxDasJW1g9TDJsfhZmP2wxJ9Hfds3JM50O66eRttNJl0/8XfYqav25Mdteu8qUkqs/RmEPE09p7tbXSuwlwSbVwwU3Jd8UE2HsYbqWjHHyJbUiiB3DyDCRtI6ZXikMUdQH/V6YfePsaPMxDksQXVznuejhQkFzuQsfnVeQuieRb+IjxepiD5dcFlXdUWu6hGfunvQbWEHyrKSOUDzD+IOLv5l4cvilfILIcMnRQfOqba6JbHyk+xYVVkm+lugX1JekcqPIXb2+AZALeP29vtj19w2mNdw86ZqwFEZOvjBGJZNaK72Xuw/07+/p1KIk+RqvxFf1eVHua5Tx4qJ7UGyUDJNcbizo/khkRSXflaLEa+Lvui6sDhK8UeeJsPtr00Wy3oWi3N8oyMYrX/aNilx7BJd4D6pH0FgJS0F4qzEXpN+Kcq50bdhcL+0X81GbJLz6o19U5dvuRck/bkzS/Bf2mSSqdf1F/Z3XXels8dUo5UeNyWUs0p8ASBMr4FaoXPiHme/Kt1Dw/D7R2XZgM0DRUJAHnrOJ8nGAEZYKDdNA/pVTvh72zlaKW+dCtqnrA3F/xF2UBzxn4/z+OoyLG1vcB/Vx+PbZPp9bG8f8uKnQ8LhSf+NPqBfqWYB+LuD7bl9Noa5zylKntxL+eoNsw5aTE1QvbjyHI8ef0kH6apLLYeDGJftDvVLjJv25cRtOTr701aZfEP+R7Fu+7GeyF4U7ileJXKn/ScaD2lfNFboc2zglx3Wc4k3xMOlPjXP49dzIYZDEH7fn0vXS66BxYMJnGqf23ORfer624aJ0CjIu4c2t53hxunLzKN05DC5yKf1dcpBkvQ2HVBeTHFMtp/gF9VUbTluO4vDY+JrkcHGkXqv2ofoqCX8JTsr2uf3RicIv1Z+7pmJZYh8dTxD7mLBTNqSI8xUJqXkyd8313Op1EPvrsvT1Lvaj8FDvTWtzJHlmUO9zNYXTX+Uv8R/JM4++X5I8rPLnxim5UT1TUdcS3Pqr9Jkw7Djlm6Z9ltpH4p8u9pOMq+97vgGgOkPcn0RJZXEbLMEnxR2HfpQMgP+ry6otuKCm3qvz9HHTPQkv23obSf3IJDsMX26tKius70iJC3buWhITNrtxMWbDGWVsUfMlMR1ERlRrTeuD2oeKNYBvVKh8kLvP8ZTuNSXDpE8UsRCUb5D8L7FXELxhiNv/HNnysEvdo9ZxMkx5SSrDRiYeptzH1UgVn4m/LQZtedNFDxei4tpEXE+gjlO8TfnWpQ6H6aMksdkfuTqIzKBrgL753NQH2Oa46hBHHxxFHZSSrXZydY+7l1sbJ9nqFpd3dTLVf0qWyd9M+Fz1ocYpfFHsf1h+UWNwIW5v1GuOJPnb5VmBm9fnbwCowiUK6oAla6RJLCieuBq9gfnRUqHhiYPORswU5atpKgTehUSFFuOujSLg/k+a9ef8sA1D3PYsFCxB+BWSr/X3/EL2s9x8oDB6qbMxj+hzAfkBXn/7JjW3UPgXkl8GxfP7Nv9szTu/D/ONfwMg3w1EFOuB/vsjdYWWbILIiJLO9Ye0fD8U57tpLBTZLhQlrjgfzoKuOVsp37r2d67Mhz9EFc/9sTf57BPydbDBySnEOn8273++6Vyv80FqYNz3C5n6+6HNhQrdvlHgK8T4iFI2EN8zLfs3AKj7+rh6bQpwyStg/52T7drEw/WVIol86bjaNEhxeZ7XpzDY8JnmS+VKXm36mvAGwWWbZ5rrcm3bD/XaND9HrvvHEbW3Lng5nty1vjZ37bIfpnGTD7hc2z5VCeJHEvmUbW1+7Rr/HEnys5QHxzOIfVQy6RpEriTOpLVAQkFxUPlIKt/GK4j/UDLVB0FKXhjdJHkz9yqVL8Vrkyd5pUiXb/MzU27g7KOTLd6k+YfSgapJYezDyef2L8o8EAUPyn/Ua9VXXWJEisu0VsXA8ZD0Jep7bj9MsWN7ILHpFMZO3BqXfOQ6T71nyz/cfIk8ab6S6mbr/11wSfG4XLv2a1J7mXhKr3Nk2j8pXhWrCx6qj3GRa/ORhHqTKmxU0FPzOcVMJ+O6DH09hyf3P3dKapKvXuv3w+BRx1XZOh7OXhQOCn8QPKbEZbMPhY+6NuHh7CE5VaPwqOSKh5JlwiexjzrXhEd/tT1Uu8Sbnihs+6UnJlPh0eNNveZ00En3a9N8Sp6OncKj86De63I5H+Wwqjyl+ZG7p+tP5Ukuf3IxzOGxFR+dTPah1towSubn+HPXXN7m8HDX+hrOPiY/1nUw+Tcln+Kl4+Vkuco35XEuN5lqJDWfw0wRtdY0JolVCrfJplSuo7BQfsKtsdUqih+lu6obN5/bNxtOPa/b9ouLMw6fZH9yr7bexmRjlYd6n/MbCgc3TulG2cSGhyIKs/RaXc/x52xJ2ZPbU0ncc9cUL5PuFG4dnymuuLxuqiO5dRI8Jn/m+iUKD6Wb7VViH3WuzT4UUXmAwqPqzI1TsWDKPxL7cHhMazky8eDqhq2OUDrppPskx9/Uv1H81DVcjNriINJ/BlAFoILnkpVpXZDxsPO59VyxsM2PGl8c+gCyYiXBZOMXBrNkLGr/CUv5lmejKGNRnQeY9zyOeIgc+aUGAAAgAElEQVTD16Iml3wQtT5x5BaXvF5ovk+RqWBTDWPUsWNbn+/6wPFx9Y2w2ILon09/jHtfwto7Kv+LCl8QfkF7yNx8IJqaFPVa6fp85c/+7rmjtqVEH0BWZ4PUZElc5runjfK5hOLlMj/fuSWIPlFSf9VwKTkfAIQxeBTKhSkMceCJkmfU9omCZ9Q2KiT7xGHvsBS28SkU+9gKRVDdot6/MBS1LxeSblFQIeWOQqRCzkWFVjfCUNxNXr7pXNHDRP3dJ8RJ/R3r+bBPf+1BFHkLKJwPFgqxhsaZTwvdr11wFAIeG4aEOpFaLBEQFEgQ/jnD5t6beNnumU6Fgt6L+oFAItMkX20wXXlR/DgKyl/KL6j/6PNUHpKDLNu9KIoNR6a9M8038XfxHz2+qD3h+OfWcvHqipWys+SkPyh+yT1J/uFkUmtd/TGI/7tQWJsFjVeOgsRa1HseFen2calF3Jwg9ZCjsLxcclfcfqxj4njlY8+DzNPjUM2pNv5hYj+qe1Qescl06VtMPaIrVo5/UD+Oy/6ufV3cfa+EwvCS2j9sD+R5XujcVah5BAjeI1L+4/ItCts9Cl+cOUNKQXog1w+2orznKjPBMcndtz3wUMmW2ghbwytplCW8VNxSZ7KNqbxy1+oam4PotqReJTpR/Cks6j0TFkpm0FedTDpJsZmuTaTbQPdRUzBxCcXkZxwGCot0z1WyPehK7MFhM43r7yUP3Cb8ptjJ7ZEtliT+o+OgGgMKK7UnVOxTxPG3xbCtaTEVOM4XJfbhsFAyTXEosYdqR1cMLvNtsSDdOwlWao9sWCQ66jxcDoUkucsk00UHDr9Otrxt81FTTJte1XmmHoXDw+nO5XIbL5OO1H1Tzcnds/mgCYsEAyVTJ0kO5dYGlcmto3DZaqMkT+XyuMl/Ob25eTZfcu0DKJLmQ5OvU8TVagqrKSe55GpKd2n+0edLcqq+T7ocl9qn3pPGKceLwmUjk0xpP67f1+1C1Q2uflEyqVdJvtfl23TS+dn0tcU0padL7jU9Y6hky7OULuocyj6+7/f+CQDFlLunMlKFBPmURiKPSwCmuUHxBJUXlKLgIeUb1j7SJGrCEHZuVPYKa5849t4k3yQvLh+yYYqbXGIxyvEw2OLgGdQOrnJM44VqMxPfs80+JnlAtN8wC4snKvvEnUf167DyotAjrrkuFFefUwj2iTNX9bf/SHKBzd/D7L1LX2LDE4ct9eeT3HsXHq7ywurAYYwjFl3tXwj2ccnlYXv4uHxVIs82n8IThif5NwDy/SAmpXw3MXHIjJIkzg0UTtPY3/L7Q5+zOUZc4iPOQ5m45oWNj6CYJHML3ff7OzdQGArJ/mGb5HyQS+yGqTVR5oggDaZUP0D+tdZ872V/5fUocOTjISMMvzjlBX0gCoM/rj2KkqLMPYVMhY79XLd/1FSIuScMsQcAPRMiaJ5dTuGkc3NzbFgluoSVb2t6VPkUHgm/qORL+HHY1GsTP32edG4U+0PZW4pTak9bYy/dH5XOBn93xUpdm+ba+LnupWkepzu1vzb5LrZ0mW/zTVdfj0MfU+6w6WPiGSR3ufIzxa4Epy6fwxt1baGwBvH3oLmdwqrKoWRT80366Dhc8oqJZ758OR91SJUdpg6FyV2mNXH3fa59T5Dcrs91lR9UH65vdKnTpvkS+3BYJfxc7MlhzVddlfKT8JT0iC6+JMWp86PWFVpdN+XysLHuIt9VH5VPnLnLFpc6Dhs/CmPPAYDNaaVzJCRtVF15c0lNvQ4qP4h94qQwslyasijlB933qOwadA/j0jUqktoVsD/sxrU/QeIpnxTUhlHyLmR7xBUrrs1dUDkuFFWsuMjrz712JZcHO9O9qPqHuPoJKY6odI2j9gXNWVFSnPYJKj+fFFf+jysH5VO2lE++nk/i1CuoHwDh62OcdTZIzQ8z37Y+qvoUFbnaMIx9pM+7uXsJbgIFgJujPnir77l7FBj9PeW8HKlrcv+76MHxMq1x5WsiV/vpsrj1ufcm++v20uVytpfY0GUNNSfq5iXoHsbxQCPhISVTPKlzpD5N+Y1JL5P/SDFTPEz+JyGXtZx8fU5cvkDZI4zuHBbpXCq36xSFL7ja1CZHl8nlQBtvm/5SzBK5QXKplKTrJTVWnWPTP44aH3YvXGRJeOTkBolvEz8XO6vrqfdB4ovTXxpLXL+hrpfkfyl/Gx5TXZOst81zlU+tl+YzF7629Zx8F3/OxaVrnrL1vJw8Ex8Xn5L0xhKy5SRJLNt0sPUmknjS+bg8U7litvF37W1cc4Uk59meM1xynO2ZTdpb5u5L7MPxl/T56j3yJwC6oKhPReI6aSlUub8vlG/7Sk4Cf5/x2OS74HFdG5Wu/W2zoHSu+UKhxVJca/PJs1AoH74QxX5GuQeuvPQH9LA4wuTic536y7+4e4WW+/Jtnyh558PvC0XX/uR5NlOUPtIftjXJLDQ81gOAARqgASocsiXHqBNMIRSnQsAwQAM0QAM0QAOUDwpzQBVkfVj5AzRAA3T2UUK9iPMsgPuakOtXgSRy4pgbZH5YCivPZu+o6Ww4S5J+jTEMb+5eFDJtRT7KT8ii4BeFvV2/Vi4dd10b9V7a5MVJ+fL/qHjlwz5Baod0TVT44/DBQq8T/VlXJH1LXHILkZfOMw7bULwLyR/zwZ/7CQ3HK4qfVFBfK467B+3vOhqHfmHXxsFTHS/03GLiHWfNi4NPoT0T6Xh6HQDYfivlKkDl4/q7jDhI18dVnul3jVKZLnPC/h4pzNdmgswNYh8XisLeLr/bdJWVb/+Oyx8lJJWVL3ubmpioSP+tVZT2tmGNOtdEdbCjUpT2phpak35xHK7Z5rp8ShaVvXUfpOa4kunrzzY8UVFY/3Z5qHCNkyD2cSFJLPVnH2Ei0+9Lg8rUa0bc9pb8RjcMRRlLcfTIlL1t8lzqWlh7x5lrwubQMHvLHbKE8UeJf0TZa0jkBd3bILnFtS8NS3H0tfmkBHUzTNNualC4+bbiHfSkzBZYYRuFKIJNOkdCksQhsYGamMKc1kZ9IJBPW0rI1d4Se4YZD2OfOA4z4j7wAPoWIpPPhW0ydF4SWfksNPnONS75M6yv52Tmi/rDv23NkIv/hqltkprsQpJ9NNlS0o+49B2STzelsnJk2xtb3o7C3oWUa6LsFYI8ELnY24Yn7gY9H7kmbK8bpPZxcyky9SWm9XpsBZUVdb12wWMjkw1ce0pJ3Ebtj665NAxJP5gxUZSHyVHZOyrSZZEHAEDfT9Qoo4Qxju6UagAGeWjVA1gSNBxfSTMapABJ+bvKN/FX7Wl72Nf55z79MCVHij+H3/U0meOrJz0TD2rcdT8kmCn/1V+pT5N0Xpz/Uvxt9jT5lCnGKPtSfMM0rWEfxnNk8t/cOJUbOD7ctb4f3N6Yxrlr7p5kjOMfZj9seKXNks0/bbnatF82/w1LLg90trXSfMUdvFLj1Jjr4bsEC8crysPdoLVNnRMkfqS1y0a22mbaG6k8l1xvGw+SGzg5rrXetEZ9leR1E3/d3hx/G7aocnWYXsM0P6pexqUXdjnA4/rPoP2Vjk36YMzxd7UlN49b6+LrpnFpT0nFjX4vSH/IYTPx5fhLbGKyqW0tlV91n9H5q9e23CGt5xIdbfERJr9L9oP8I4CU8+jjVPOmByQXoLYCoc+jAsFWcLlCIsHHjUlxS9ZEcV9aaF1PVyV2cd1DyX1X3q4yTXNNyTjqPZfYJAp/DYI57L5KZQGyhxRTfnGV6dI0SjCEzW9SvBJ+0twr4REFfhu+ONbkw3eDElWP4vJl2xqXuhClTYPqHOV+cXaIIn6CYOBk9YePSsnVVlHUJoCvhfmoiyZe+fAdKjf3Jx4pb5d+Pa7c4GKPsDWHi2XA3QZR5F4Xv3Hh7dovRdXzBfUX276YejwVt7R3z0e/FlSWSs7/CkBYRfWxHiARKF/IRRMIlhxc+ZnuB6F88oq7sXXFF5Zf3BQ1vrj3upDj0+WhSDIWt+8Uki0LCYuU4sZc6LnjbKKoD6YKcW9ca2PYJj7Kw7UgdT3KB/N8ri0kGVKK+oAkyv2M2k7SHi5oDjDxiypHxW2TQuMXpYx89F1R8o/78NTGY+CfAYyZbA+otsLusj7IuI41znEJFVLhHKABOlspHw122IcCwO1TPddcGed66vCa+0SB09+lDgzQAA2QnPLRWJ8LFNZO59r4QB4eoN8nSgC9m5nctf6/OqbPNa3j1kr4uM79/9l78ygrj+RO9HeX2heqiloooAQIEAIJCRBghAQS2tDSaqnV3e5VrXa7bc+M2+15M2P7jc94m+NzZs54eW/87PY7z92eabd7tVq9WCtISCABAgQIBAjEvlZRbLWvd3l/oIu+SjIjI/LL794LqjiHU/f7MjLiF5ERkfHlXfChMyhLgo/SkyPbg7NOJ/VRFFVnLDb2O/s5/uDc3LXqMxM+nS06vDp86hxOXKj4VV3UeZVpzVziWMVN6eTO5eoMKyeMThdbqLXl6jStkWQupdMUU1HpVCmsnTo+SieV57q5Lnmly3VOHQiOU6Srb7prnU5dnaRqow4f5ZOgDJtdOh1UHdfJpXipeqy71sWiNO+lOtU5rnVKncvVSdli06mbK9Vp8le+dep4dTpd1qhQOtXXgLmPUEk3n5sPOntdsNt0mnBy5dqwUzptdchU74LjlI90c7l2mfDZbKXixKTPhk+1z6XW6ObpeLlzuTmYT50+4piyRXetjklizDSXkzu+bAlTG20xFctepjHvWgQTi0NqIrq8c8S5R+GksHPv2fCqRc2mTzrGxeaCnTum8zGgf6curF9tGKTzTfFC2UfN87EOEn22eVJ8YXBz53Hsk2KQyuLw+ciDKGtc2Jzi2MfNZdf44JDUvrD10jV+fPrAdW3C6pPWHN1Y2FrDweljTMLvq6aEmUf5OAp8tjUNuydxsEUR6zm5QXlR+5Oz1wTxmOaE7bd99F+ceWH3LdveIok9qS0+a6FpzMYD8GOBusddh5y+sD2kz72TWgfXGHLNg7B1zxWnK7n2khzssUwmkw0bAK5kAhe13jDkWkh86/YlD5BtnD42naiaa9N6RLUuvuXnO56kWAB70xaVLzjjPjYzV0y2tXNZW1vj5Bszd8yHrKhj3SV+wsj3/ZAh1SepRYWs1xz5Lvpc9uUwMeIjNymSyC/GWknJizr+fOe+qU+KksLEF8d+QP6DbBLdXPw+5FNywsr30eP5rMmu+2xU/nLBKZkXJc5iepYp1HqQBwC+lPjcwIpVlpR8NYzFfFjiQj7tvRZ8V6z2FoNvbHS9xcLHjXw+RF0L6+dz77ne6FqLhWKt265UTHtHMcT++PrxZUV5mMR5pgh7AObzoc+n71wpLIZ871NRP4dFGa8u9ufbXoqufAUAcP+YtxowQVk+rk0ncTlean4+8AFAJjv2OxbjNE7jNE7jNE7jNE7jNE7jNE7j5Jdi+OhZTHKoEeQPc51VnvtMn7ag8EX1TGo6xAlej/lfAGynbVGeXkkPIbgyJe+yu54KptJppFNpMb5xGqdxGqdxGqdxGqdxGqdxGqdx4lMsFkNpaQnJI33HX/csypXH5fX1TOsif8wBgO4rAGFAUycbnDnBa5cDB5eHeNOnDHx8vEPyCYqwi2s7afKlnyObE4A+DpRcPt7jMyk5/jXp566DL/3UXNfDLwn5PED0URsA9980kGLn6nPVw8lVF/1hcIXJJ9dYCRu7rnp850zY+C4m/VHlis+YsNU/2z1qvo+1kzSxUedmWD5un8KV69K3qPptJH2IcOGRzPW1X4fteU2+DPPmG3eOFJMrhXmmsM0vln1U8kzBwShdV4pf4iMb3qjqXpTPNBx9rn5mfQJAAswn5VufjT7u9vum8Xi7dki6Vh83X17v9l7v9tnoerc/yloc9QOwD4rSvmshdqJe33zIKJT+Qh/O+ZjjegDAxVPow8kocPjQF+VBnO+5LjKi8Heha4WEig2riieeu6ljpF6rf218LnqCJzq2+dms+f/aDYNDxcOR6cN2DlG2c/zh4i8X20zYVX/qxk1ydDgovGHHJWvFsT331xbTujGXHAy71rq1Cr6WbAiUbbrXwXu+6k+YcR02tSHhYFfHbfN9YOfopHDqqJhs81Xv1THqHYViw25bP11doN794YxT2E25IbHNVn8oHJzx3F7jUidt2F3Gbdg5Mave4+a1dL5rn2bS7bKurthz92y9CCWfg921l9GNu+RTUL8pR3U4Of5Wc0en3zTXZd9Q18rk23zWUd0Yte5hsJvWiGOP7hnGpeZx181mTxg9nPkuOm1zJDFL5ZOL7dzaypUz5hMAvikYcLpr071iIV/YgoHg8zTQ5l+uPl1x9UEce1x8XGwxw8UT9fqHkecbG5eiyg0fmHzxR+27Qs33IStf6xqlHl1j7ipH8jFGX3EnrRMUNin53mN9UKHzX7Jv53sf9K0zihj1Nd/3Opj4uH2bq55i65eCVEz7vk43QNc6ST0s1j4xLH+Uugq9/tdiXZfkv+gAIKoHRV9UrM1JUB5w7eArlo2D2xgXmoqtmEnWs1DYgGj+P+KwNF7rwssDihtfMTfJxVzrig2bLleLaT19PShGRcW2nipdC7UEKF7/AcV50BaUV+z4ioVUfxVjzzle69wp3/F75SsAunMA9V5OkCqQmhsc071W53J4TPdy2Ew6g/covRRxsJj8mcNH6bPJD/rEtA4c+3X3YrEY6x173T1Vp0SvjSdHasNOYZDotN3jxhOFj0th/GbKV/XalpPqtWs8Ufd0sUatoaTmSO6Zakyw1rnaz4ltFx4VIyWLa7+OwviYkseJOfUed/25dYjbnEjvcfYsjs+D+SGtQzadYWuMmrth9myV36UO62oJtc+65rDrHiOJNd0+EvW+Rh0Ku9Yn1z3LdC2t/5Jc4+Kl5LnWJxedkroezFl1rgsWEx4XO4IkyVdOXXetQyZ5lO6w/uTgCOaBqbZI92HJPW595nxagqNHHfcVc6ZP1viwX3fPZhvnvo/8UvlyvHEqaXT31QA0AQ7ymeRR4IMydLIonbm/FF5VJgcvJc+WBKa5ErtsvFydlI7ctarXhk/VydER5FF9brJTd7rI1amTyfGJbd2ohk1XrFUfqDzcmAgS52FQtUs3X4dFjT8TcdbahoWaF7xny01pTugaJNtcm122xpq7ObjUJqqu62Rz7MrppfiCtcO0tlQ+qdem3DbVJmk8qX5Q+XTyqbkqn81+teZyiIoJ075m87kknig+HVYTnw6faa0p+ymdNhySuKPst82l8FH22w4DwtRcbj9i0+HaJ6p2meqh615i0hE83JXgldivw6pbW6ldVGzZ7HGpfzos6v2wc6l5QfmSmODua8GYMNUmEx71OnifUxOoOsDVSfkuKC+oz1efZMJiywNbjbXZT+UXtzapOin7dTnGscskw1RjpXGoEjcmxszJBu6YnKEDYtqUfVBQFue1Cw7Toqrjuo1ZSlKsrvrUwDPdk+Lk8JnigiPLNi9qe1xxuZLNHk5R4voreA8I93H7qGNIysPxWdQYfBJljzoG0A9GPn0rmRdGZxiSyDblR5ia65vCYAxTu6La63Q8+fC5Sz3KR12Q9jW+9LqST1z5qNvSeWHW3MfeGobCxqsPTMWwV1O6fPnd197hs8d3kQHI4jWKZxIdn2k+Vw93zDUeJbJ0fo4q11ztiWUymawrQKpJlVA+G0OfDazPh52oMbjI4iZlPjEUYv3C0LVqT6EaTYquFd8VA+nsA4rru2+STftaXK8oHlSjpCj3s2tlj3ClMBjUJpljH+Ceyy4PMT7sc9VVCCpEX5VPysUQYI8jn32+qi8qX4TJkWLs133mWzH2TcWIKWrZhcCgzr3qRwDDGjg+/+M9f5zG6eNMhc6/8fnj88fnj88fn39tzh+nwlKh1398/vj8fM6Pqzdyk7NZ3ncSXXiCstUx3Uk3pUuHM3htGjfxqPptGFSe3Ak+JYOSozuZV+VRckzv2Jv8zZFt46HGObJ1r00YuOtJ6eGM2eyx8dkwqvck+qXxZbPP5IfctW4NODZwYoPKRUq+LW6ksnX26nDb/KirXz7zl8IhqZeSnNPxcfRzZejqp4vvTPXThlE33xTLttiw1W/dHI6tFGbbOJW/Jhmu8UVhNMVd8DXVf3Dyl9JPvc5dU/2HaY6JOLErjW/uPcnroByq/+HEqpq/JjLhNuWfCTd3vi5/ddec/o+KY0q2Tg5lH7c2U+PU+lH6ObntYp+qw6WmhK2NpjUDzN+j5q6LaT6lV5c/OtkcDGr9lNZLn/nLqZ/qPdN8bt2j7DfNDV6H0W/SI6llVP2z5YpavzhyrJ8A0AmlSE0EU0Pr+hFC21wXvK5YXOWogaq+VoOxkGTCIvEBl9c1Xlx9H5aomOToCZsf+fZLFPb6XI9iI5eaRRVxjiyJXAlFNd+lNriMc7CE5fUpy2XtwmCl5ob1V9jawtHlcz/yGV++agBHr40vin7MND+fOWbrp2y6bH7RPRz48Jer3b77T8Dv10koXb7sLTQVal8wzQfC/S6bre/Q8fncc6Pav8PMoXAVuub5oiufANAVOd21cl5wFdkWTndtuh+8VgtmNkufblH3uHi5pC4mR6cuuYI2qn53xaW7lvpdhyVoA3Uvd9/1HnWfO07xhvFvThbVOAdfc3Vx7dH5W10jLpnWTodLsnZBXLoc8bHx5YNMuUPVRV2TZ8qx4BydnKDvfcQRtwZwZFHzcmM6H5g2QVNtobCYxm3+1uF2zSGTDJ1eG+n2Be4cSX3X6dPJ9Vm7qD3CtjYSXSZZrvFl6olUHTpZPmqxz1gM/nWRa4tPn3uypIeT1Akb1uDa2eTa8IaNCRWXj74l99o1Z1VZHL3StVV12Oq15Fq6BwbHbXuMtPZy1pNaA+4+KrFVJ1cXx9T+HhwP42/bXuUi00ZUb2bqZV36RJf7FI8o9rL57KLHaZzGaZzGaZzGaZzGaZzGaZzGaZzGqSB01W8ABElyaiF5h5MrzzZPeqoiPSWyyZPqk8qX6HM5x1HXTOp/jvyo8EWhLwoZ1H3pSbVENsXLnU/xuOaWLWdV3iC/Tj/3NF/qW1+1QWKvjU+Sn9Ja6YrLVzy6+Nu1Nrjos8kLS2HeAdKNc99V4ezbnFw35SlHngtJapFv8r2vu/Y9HH0ufVlYfKb7YXFI5HDquo89Q6dXkgsmzJz73HGKPx89bRh9rnrD6jPxRLkWLvrCyJPGpwu+MLXLZb5Nno03bB9b6L1PKsP5EwDZLO97fTnSfRw2Cp0SvnyS6uaw+CQ25tNvUeDyQVcC3kMc5uRJ49+HTF/YcnxcbJTc4H0Ojw/Kd5xJfcWRl09/RJ1r+artvogTs1Hpy4esHE++a7ovmb79Bdi/EqN+rDNf8VzIfiVfsQ/k9zeNChGzPnl8kq993jbG4dPdd/FHlH2G7zUsRH5z638h992oeXJ8gJ/Y51Ih6h2XVGzkJwAosgVVjsf0nREdv+1aN992isU51aHkBa91pz42/tw/rh9stqkPsjZbbfp0fCYezlmRj6QMe4pm8kHY796p8jg83O/YcWX6lBPEFmZtOQ9SnO9tSYhTf0y8Lnol68iV54Oo2igZt43Zrm3fY7TVYXW+TbdOvoRM3+eLSp9P4tYeLq8Pfb5l5jvXqO+6qsSJTQn+QjaK+dDtu3ZydUp7lyDp1lgSR7ZaJ9Udpk5z5Nt4uX2n2u8Ge2DTfBUDpwdWD+tyxN1HKJtNNqo81LhNnkq+9xNu/S9EXuaLJ8eX71pciHrHJRVbHKAfbHXJZOLP/aUeKnLjHP5gMdEV0NyYTp7uIdNUhGwPMMFkUvFS8nWBoM61FVjOAxpVUKkxVb9ufSlbufFgwsnRqZORw23SbyvgUrzSHNCRzV9RYFPvUfls87ntHifvbWMmuUH8HGw2uaYmwYaDk4P5iLMgj7R2ckg3V6dLrQe6eqbONfFz7VL5dLok93TXnBjh1M4gUb4x2SmtO9JaELzvO1Z91Dh1LCjbdZ1198LabKqdNt/7rgUUv0sOSPDq5ERdE3WkxnbuHvXApsMr3ctUf1E9qU2GSpI3Skx1Ve2JTbbq6qBOvqpfPVAN6jLd0+nQ4Tbxm+LXpovKWRMmKsc566ur/6ZYNcmg9Ifhj0pXFDIktYhbO3zg1clzWRsKr6u/yLjMZDJZzgNt8B5VkGxjakLYioHkJIUzX01mTnHl2qsrBDo7VR2cdxsoPZKCZ8LPwULN547biqvEFzbMJv2qDEq/6kMpXt2BjzSeOPJV2zg4dfGjzlcLHLc+cPPc5BddbJow2GKbQ9LYs42b4oxbC0z1x7SutrXUYTetA2euiTg5F0aOxL9UDtj8q4tfSgaFxZYLujFJ/FN2hCGO3aZ45capzZ82XcH7qi7TPd26qBioPYYTV2H7GK5t1NzcfKpPoPJVJWktl9QCKg9seHU+kPYlFI9tj+HslaZ5OT6T72w8qh7T+lP7BHdPo2zhkjR+dPZJcpGz55ls5eR+cNwlrmzzOTZx9Ukw22o/VeODfEFdOh2mcdveyiEuBtf48UGSfkOHNzfHBX82m6V/A8Cnsa6bIGcOtam44HeZ52ujKqTPqTk+sVKyfDauhZiTz/WTFkPuZhgGlyR+wuiRUiHWKur1c5UVxXypzLCNjIsMqXyfc6Lei8LIB8xNWNT5YdLtIquQsSCRle9cux7kF2pfyVdcXeu5ZuvffPWVnEMLyQOzrx4qH/mRo6ieo3L8YfflMHNsBxY+ZXPHfPEDsjcrXUgaj0X13wCGPYFxeQj3TVHqLHSTn4/iQM2XXo+TjKSF2WfBsl1LG4zxWLj2aDy/rx+SNls+DzPV62stbvKN18c+Dfh7yAi7719r611MFNaXrvzSPsAVz/UeG9faM4/umS14rZN/va9hPmnMjwBSZwGu5wQSmdxFpmQG5+hOkqQk9YkayD71uc5zOf2lbLZeiUgAACAASURBVOPOM51Cu+rTXfvUxyHfMl3l5Tu+VJI0e9SYaY3VmFX/6vC4xgJFxbQ++RwrBH5OvvvU53vMha7X+KL2Qd2YJF91cUDlvzqmUrGNufQ9YWIlbF7FYrwfk6X6ECoWKLycPYTCko+xbNb8+zHFgjE35uJLHb9Un0vt18kz4eHGXj7GKAqrz+Xd+LA4uM9ZpvUJ1udgLdHJD6uPM0aR716q0PjjuuLEFZ7j0813kavO0ck3FSRd8TLh0r2m/nKxBGVSYyb5QRt0unOJopNJ2a0bM+EyFRIdVnWddfjVMZtPXQqIzre6ubq4pPBQfubI0clQx2w+Ma2TajeFybQ+Jr9R62qyy4SB6wcVg02Pbly1LcgT9LNtPW2+54xxYl0335Y/pjGTXwB9zbTlCeUvKt+CcWmKWZ1PTPoozJTMoN06mVQ8c2XqMAV1UTbk/qr+0o3ZZHDrB+WT4JhLPFPrSsk0yVAxcnLRZJduvVWfUP7ixLqqm4pnal1t83T4TT5TZapyqbWjHiQof5kwqPJVv5lkmfxFxSIlM7g+Ko9OnzpOHSbp5uXkUbEeXA+dXyh7uX625a6aj6a6YfILJ2Z1+rjxo8tH3TwTfgqzOk9dbwq/Trc6TyffJdZt+4EJp6qf0sfJSZPeoN2mmmKKRd01hV/nZ27+mMY4vtX5i4pnmz02nNy6YMo/Sk82m+V9BcAU7KaxoDPCzqNk5MYB+bvbElwczBS/rhCaNnMdH1cOR49On83HqiwJv3SeSSeHF7D/iAZHtg6zFDsXc1T+4PBTm5gpjqKIFSkml7VQ80t3zfUVlavcawnuMDngU08UORCUDYT7GLG0PlNypbkT1jc2vWFrvyTebbEu4eesiU2HtAaHrdnSnibqmuiCl+LjxnZUuWOa54PfZS0AeS0PzvFd+337XdoXRok1SjmSntO1pvjCqpPL5bH1p1R8Sp5JfNx3zR0OTmktpuLD5/OAa7/sc9/hxmhefwOA6zxA9suGnDHOOJeibISjxsFttnS8krnXEkVZ0G3FWB2zXft86IiafDYaXH2A/GNwwfmuvi/0WhRCv/RBzjY3zPU4hYtfkxyXcSkVei0lDw5SmdyxKA8IipHC+kDio49jLYkyfiVz83144oIxCnlRxpTkodgXrmLPkah7eFf/Sg+a8k0FOQBw5Q+7KUS9CMW6yCqFDcprxc5807hfzCTNTd+5HxXlW+/1ri9fdK3ZlU+8hc7VYt2no5oXlT+u11pR7E31x4mu9zUIWwvzRYU88CmE3HHyQ1d+BFB3DpC7ZzojoM4OdGO6QAjyZbP0d+Vy1+o/Sj4HlyrHNEflUa91J9qc+Tb9XNL5RB1Tcar8uvVQ10Vim0mP632TfIpMNlCvqWtKDpVHJmzUfVO86/5SuSTBRcWRbq6OX9WtexeA0qHmkvrOJnf9bbZz/WKKn2BN4srX4eLYFfSjLj7U+aY6qdNj0q/qk+KV6jPFMSd/KTkq6Wq1ZE2ovKMw2mq0yRbJfVdZuTGTb3IUjAk1t206dfy6mOOsOyeGOLFiw67zi63eBe+ZaoSqxyRL6l/TOnLm6+SYcJnWzaTDto46PSZ8OX2qHEluueaiS6038XProA2zSx3k2G6qx7nXao9uy9swmKPwvSnWODmvjuuuo4wvCrstRlQe0z7PsYXi58qg6ikl07V2SNfEdN8U76bYsuU8pYd7X9VJzbnyCYBcMlPE4bHxBYsG5+QseN9lju2+zSaOLVzMuqIimUPZz3ntwx4OZop86nfVI50Tdm04smx6pD4LjkliQMJD8fnMm3zqB+zfoXfJO5MeDjaX9aPItQ65xCCFIYq4cdEfzBOAPqiW6HFZZ0pHPn1D4XDFxZUrrQNcv7nsxVyKal+NksL2KVzZUh5uHobtrcLi584p5ngy+c1nDxu81t3PyfOxr5nkFHqP8qmnEM8k6n3OHC7+sHqk+rmyJDJc+X3MCbOekXwFwLUQquB9JzJVIMJS/8md2Ng3FQ/NbbLi8E08f3dh88tbUH7Haixsupon3b4HP9qwH4MjmStjM1c8jlXTKxSh/Tj47k5s2XMGQ7l7E27A6rsWoG1i+RidmdQwju7ejM37z2EoW4oZC5dj5dxGlHw4PtLTjk1vbsXhiyNI1DRjxaq7MHNC8oqMSyf24PXN7+NiKonG2Qvw8B3TUJ6IQ0JhGhFXKkQD53LN5eHikMz18bDDeaDw/fDsSlFtDL5qmy02gtuEqbFTxzh2cPaEqGo2Rb72Hq6esPo4+ZQjXw8WXMrHA7BLrriSS8xSDz4+sXHwUbySmsrB7LIn+SaXfRKQ/TCgC44wsqT6JHtmPslHjxKmDwj78MetBRx+H/ukb7L5qRj25XyTS8wWKyV1xRyA9jX3Xo6kc4KvKTm6+6biJpkj8YFaWEcuncS+CxPw0NwmUiblF1df232QQce2bdjw3k7MnfMQFjRePaf37CFcaLgFT91Sf2VeZX3pGB/GYjFkRwZx/OwwWm9eiJum1CAGAMlyNNaUXGXjxf2v48XdWaxYeRfqY13Y+MbzWBP7NB6dW4tYthtv/vJFtLcux32rJmDo9A788tk38KvP3I8pSWDoxEZ876Wz+JX77sLSigy6R8uRxNWnXLb1UePAtH5hfU2ts1QPZ45qWywWE+Og5tj8po7r8Nh0c2zkNi7UHBsOl3WWYuf4Q7WRwqaz3aRPZ48Nj84ek19Ma+F7r6Ds8bE+QT6Ov3R4ONh0MnTjEhtt/qfWz1fNk+aCdE0l2HSyOevnao/N16Y5krok8YEpDjh+k9QDah052HR2UzJ9xKgqn1N7bXOirEVR2BhWTxC3FJstT13nmO751hN2fXTr4jsOfK8Phc2HHklc+6yTvvSoPggbO7a64cvXSZNi08QgUcGmG1fH1HtBXtscm9Ny4ypuasF1eLn26Piz2SyyqWFc6h9EWeUEVJXGAWQw1NuDwVgZJlRXIJ4ZRU/XRZzvGUQaCdQ2NKNpQtnlR91sGt0XOnGhdwTZRDmaJjWhtvTDd8DTQzjXcQ7dwxmUVFSjubEOFcm4Bm8Gg2f24c0LDVjUXIpBgz2XzvVi0uSpmDq5hrQnNjyI/ngcN7a2om1y9VW8H83pwfZNp7HgiV/HghYAmIy6sn787NWd6LzpHjSc2IZt8UX49/fPRVk2i9jUTyB1/ttYv7cXX5g3gJfWnMBtT3wKS1vKAABTP8SqSzw1PqKIN1O86OTkcObG1PnBObp442CT2kvFrSm/KN2qbJ0PdLaY7NXJMflVV4uC/By/6OInKJuzfjrbdDaZ8Kp8JnvU1+pck40621Rcps3BhNG0zrrxoB3Bv1Quudij8gTHdWtq4tORaaPX2aBilux9Lj7gzDE1NSZbda9NsmxjPuy11QDp+ujsDY6bGiVdD6HymWwM0wPZ6o/OXtVGtT6pvLq5VE9oskNng6kemGoN1U+axlU7qBquytNhlMQtN+5d7AmO68ZUe015Gaa2cmPZNq7bH3TYdbmrWz8ftZWyW9XDqS+mtTLxqn9NdUqyfpL1oWqrCZOtttpyTodHaiM1rhIVb1SM6ephkDdMjeDaQ+0F6niQJHGSNDHphFEKJPN1pEswzhxbYHHnmEhXVLkUi8Uw0tOBjTv2Y/pt9+LW5jLEYimc3r0dBxJtWLVkJobOHMAbW/ajO5tESSyDWNkkLL1zEWY3lePCkZ14ZesRjCbLEU+PoLxlPh6572bUpPtxeOc2vLH/AkrLE0Amgea5d+Deea0oS4zFlx7qwp4jlzD95nnI9mzEIHQBPIqBgRrUxc7g7bcuoC9bhikzZ+GmSbVIxMf6NZVKoaI8i+6Ow3jjSB9ilQ2YfdNMtNaWYozmobM4PtiGx1o+ulVWNQUtJRtxvhdInzqL+lkLUH5ZMACgddoUbDzWidHJAzhR1oKFo2ewZWMH+jJJNE6fjflT667gkawDtT5h+XUFxlbIqXu62OTmA0WmZsFW8CWybbll2hx1r20ywuSlDgunLnBrnU6WaSPlyFPJtE6cJsLEb8IpwajGbO6ej/XS6VXzjbJHknvqNWej1fFL9zAffFyMutc2HVxZqhz1YdPEx9Wp1pogH5XHrtemuDbNC0McH0vjkZKlXnPyxkY2zJxmWnJtejhW9dqw5kiSa9y6xr1v8wVnfaQ9rg2TRB7H19TeoNPD3Rul+6JkTzJh5eyhtnvU/mjrG9T7kvXh5Jfpwdj3fh4FmfzLiTHp3sjBEXaepJ7n7tliX/SF6qgWWQ1eSo/aTJge9E0LbmpMKJkmHVJS7cqkRnHgvV3ItP0KPvupT+KLTz6E+Y3DOLz/JAaG27Hh1QNoWHwfPv/pT+KLj6/ExLM7sKMjjd5TH2D9/l4suuchfOnTj+PJlTNwbt8hdA6OjlWYTaHzzAl0xxtx0+R6JGMAoAuIQVzq7cahwxeQLStDSfoCtrz2Nj7oHbnKDyPDo7hw4iQ6uodQWlaK/s5DeHPbXpzrz4zhw+AgBiuqEfwFgVi8AomSIQyMAP29g6iqqBjj23hFNUqGhjCSGsVI/3Fs2XUW6dJylKMPO954FVs6xtpHNZq+yCaTSkJfccTNB64cW2G0yc414Dr5En/ZyHRYYNoApfdMtlN2c4iLT6LDd+1V663v3NHVc4kPOLxhmxBTLNj0qHMlsjiyXWT6qDXSWsqN1VwsqPK5fqIe8FQ+1zzh+k/XZNvmSuPfRrZ8dY2FMPhc676P2qN7ULHpLQbiYpWup4vNknpmw8PBZ5LJ3Xu5NYFLLvtN8J40hn3FpY/cpsbUtZLuQzY+jh989biSWiN5oyrM3hvVs2aObDbHVaWm1zryMS8IMlgEdK9zvOpcV0yqc3SvdSfXUj1j8X30Op3qwsXzScy5eQqqkjHES6ow9447cffCNpSdO4S9ZTfgzml1iGdSyJQ14LbZZTjW0YVzpzpR2nIDpk8sQyqVQVnDZExL9+FiZjSgJ4uRwR4cPnAGU26ehQllubMenS1xVNZOxh1LbsHSxYuw4u57cHfLRazfe/4qf8WSpZg0bTYWLFiEO5cuxgN3zkd5dweOdHYjw7BfJWMBjTdi4dL5WLZkIe666248Pi+J9duOkxuEKkuNI9M86nUwRqQydLJUfDZ5wXu6eSZ86mtOnFP6VQrakvO9Tqer3038kgcTHSZqwzb5RbpONsxUTeFsLrp6qbPXhNlkGyeOOPaaeDkNbs4+Tm22Ybb5whQLplwL3lfx2WxzyQNq37HxhvUfZ8+j6pmkrqqk1g7JASg3h9VrU1/BiS+bLZL7Nl6bTlssmPJfUleDr0313ySTG6vcfUmNERc7XWJfRy55YJOn84ta/ymi4tYkw5ZTutonqXMUmfKO+/DmWm91h59h6pkp/ihsFAXXntJrImo/4Ojmvub2o7a9Tbc2LnlF5QoVI7Z4CJJu76DqD2Ub9xBQd9/kS8p/Y34EMDgYbMLUE1bduIlHN9/UPJlOWUzyKJ3Be6o8XYELnnSZkkV3qqTK0vGM1fPhawDZ7CgGR+MoSXzkk2RpGZKlwOjpIfSe2oNvfWvvR7JLynD7QxkMXBzCsS2v4e/e24SPPqHfjE/G4gFbMjj9zivYF78Vq7pO4WAXcKZ7BBdOn0D7hAY01VcheQV/FRY+/sBHeJNlmDm7Gf+87RKAKWNsLG+chlUrpl+xp6SuAc2lCfQN9iOdrUMy579kEsnUKFJBH2VTyGYSSMaBkpIkUqnUGF9lU6PIJBKIx+NI1DRgUm05ErEYsvESNM6cgYod59GFWagn1kC3HlTxMcWLbg2DMWbSq19z/XfJTMXbFEOmJktXNHR2UbqowmN72LHlYU6OTp9uDYL8nFqk6jW9pmzi+EIlExaq/pjrgvkeZw2CetXXJqw6+br4ttVYHW5Jjaawm/xny1kq520+sOmi5lH+M2Gx2aWLYVvOmPTpcpfytSrPhNU2zqmxptgx4TfVM9sa67BSdqlYJLVIxWmqRTp7KDm2+dzYUsepnDX5S4eXstnmE04tMvlIR1KM3PrN8WuQTxdDKulySsWse63bH6j9QNWh2qZiNY3rfKOunQ5P7p4pF3TXOhmc/FZ5bTlL1Vtd/TRhkMgPYqXqi6le6uzT+dqlFtly31QfpWtgssHkN1Ne6Ui3Jjo7ObVOF8eqPMpGna22/OXUIpN+ajwZdIwqVHWczmBdQgQV6Obbrin9pr+6gNXpMd3Lkepk03xuwCXiCcTSWaRH0x/eS2M0k0I6BsRiFagqH0XfYAaoSVwez2SQymSRqK/FxBuW4RvP3ImqMZJTON5Vg7n3PIKHl92MqhJTwRzFABpQ038U77x7+U7n+QH0ffA+DjfcirqG6isP68Agju4/j7obW1Ffevm/4UuNjCARH/ujggAw3HMJZ7sH0TBpMqpLPsSbzVzxRY4zVtOEyel3cboXaK65fHdk+Cy6hhsxrwZoaGvC+Q86MLpwwpX/FrCr/QySk+ajsqYXEwfP4uxoBrXll/WP9nRjuKwGZYZ4NG06Ol5qnOKjXuvIRZfuviSPKP2c2DaN6zarYPy7+Fhil4nXVrdUDJROrq4gDzXOsUvFp9NvkmWzlSLOHEleqPds9ViSRzl5VLxRsU3tURSvS7xJ9h4ubk48mvSpukwPS7Z10/FSfpWsB5VLlCxdPlK6bDVBsvYc+SZfm7Cb1sU0Tl1zfcmdb3r4Mclw1aW7x6l/VH2gMFKydDw2XdI1oh4mwuY/Jw+ocUoe9eCt5olkTWy6THzcemzrE7gxq7sfdh+R5KyphlI4TXNttZCyibKPwi2JRxNWG3HiWDfHVku4cSyNR0k+U7qocVXfmN8AoDasII/ute4eZ5FMc6X6pbpMZAp+VaeueOsoWVWFWqRw5EQHhlJp9J9rx4GDJ9GbBZIlNWhtLcGeHe/j3FAamcwwjh/dhwOn+hBruBmLkwfx8o4ODGYApIfQcXAfTg0m0DKjFSMnD2Ln6W6kkUVq8BL2vH8ag6OZgOZy3LJyNb746U9e+bdiZh1uW7Uad8+bMua7+QDQc/AdvPZuO4bTQHa4C+/sOY+pbY1XGzTSjT27dmLv6UtIZzLoO3sap/pGUV9VrfygRANumZvFtg17cGEog/TwJezcvBMjbXPQXAZU3TAPLWe2YdPBLoxmMug7swvrDiRw+831QGUrlk7tx2sb9+HiSAojvaew/q2jmHrbDah0XDcuqXI4axxWn4lsjY9EVm6cm982uyUF2CRft4m56uPapTYnOt2utlHjJn2czY/yIxeT7t2CMMTZcCTr66JPMi7NpbB4gjrDynHBbIoPkywf/lFzO197MhcXJZ+6tuExyeeurUtsu+aSqx+lPjLxuORNVDniKsvXfpzj0dVJl96Wu3f7INvDR+4+dw+gsOdz/V3zkUsuaxPGfqk+yfOfi6x82++i02ct8dFH+9R5VR3Parg5BwH54o8ai4Qo2V3vvYC/euEDJOKJK/dKy2/El3/nEdSfPYxX127Cno4+1E25CTNrMsi0zMR9i2Yh1nsGm9/cgC0HzyGVrMbtK+/HirlTUV+ewMDFE3jztTew/VgX0olq3HzXKjy2eAYqY6PoOXMQL6zdiIPnhlBS24old63AynnNKE2YC8G7z/09ztzx7/DYdADoxdbn1qP6wU9gXk0WI30deOuVddh09AIysTK0zluCJ++5HU2VaRzfvgMny6di6dypKMmO4vyxPVi7fjsOXRhEsqoJi5bfjZW3TkZi6Cy2rT+Aaffdi7YKYKS3E5teW4PNhy5hOFuCttvuwhP3zENjeQJAGucP78Lza7bgeG8K8YoG3L36Edw9uwElMSA9eAnbXn8J6/aew2iiEjMW3IlP3jUPdWX071YWUywWExUqL8LyXyv5H5Z/PLb8yC6mNbqW179Y1vTjkv9RYykmKqb1LyYsEopaNhDNw0lO/sdBdjFhKRbZUdN4/sv4rxwAqAzUtalA2AoHR0dwvuldQs47XVwdHBkcvSqPxJ9SPVyZpnc9qXU12a3+NekIi5vyi2oLx58SksZ8VPEpiTMXnVw9Np0AP7YomabYksjgXPvIaykflTeq74Cr45tbUzj+5/JIZXJ8KvGNbR4HBxenap9EB4VPgiuIwaWORVH7bONhfeFSL3QypPuVC7naCthjK8y+GrbXca0ZFAbKRq5el5riEp/SXIwiPqXkYhdXDlcmt+dzrdGcfpCywxYXKvawvRAXZ1Cv65pxZISpecWwX4WtfdR8Sc3wvXf47Ke4Om105e3UXOCYSHWaKSh0Ta0OYFBmUEcQh06HlFS7KIxBvcEx2yZn0qvKpOSZ+HL3VTwcmaotknH1nvpXZ6uNdL5ScQfxqPyULVTcmdbIFlNUzKt4dLYE1083R7dmnPU34VSJ8oUtt3S41Wt1PSj/6GxRNyt1DXXFUyVb7FHFPrhhmuy2kUtd0sV88G/utW0N1DFTDbflt1ofgxhdNkQbDtP66/hM62/Lf0kzZVp/zl6mk2nTp15TdU26j3Jj2eZPqm7p7DDdM5GpXpjmc9dVlUXt9ZK9Qh0zNZfBcaqnovbT4HwbjuC1qWZQ+65tXbk9HYWHkumLqH1Ud09nS9ieQt1PqBouyXN1vq6OcnGrPDbS6VBjgopH9V7wmtu/Bufb+nLT3qrDbuLR6VHtsvV16lxVL8f/qm+pPc7WR3GJs49y9tYwtVWnw7YGtr5FJ9fWe3PyX9I7cuLbFs8c39pyJkjxoEBb4VCdwtmoVWBqkQzK4TSqqv7gvyCfDnPwns45ubkqRp1PTHwc0tlvC1gdNtOiqzLV5AjqMNlIJTnlb1WOzm7dJmnbkKn1N80J2szBqGLRxTIVq7ZGRxfLthzSNQyUz2z5plt/nd26/KV8SG2Yqn+oIqyLWx3p7DfluonU3FJfU/VIp08XJ6YctNUtSq+OdPXIFmcqHpNdlE5bk2eqZZRNVJyYYkvFY/NXLrd0a6hbB1Ns2fzEiWWTXs68IBYKT9jYMs2x3VPvm+q2aS/T4TPtHbr9gZLD3Su49Uh3T1eruXWLW0d1+7vKb6tbulwN6ld9Y1prdS6VwzY7dTZTRNU4Krd08RO8b/Ozmns2m3X4qH3LVo9sdVSnT73WxYdOh6mm6+aq/KY+hFo3nU3UXm0iE34OBir/bXu4zhZKX5DU/jF4z5TPuhzWxapLPTJhtM1V73PqUVCnaS7Vb6kYbX0DZz1MROnW8ZjyTTfHpQ/LEaceaX8DYJzGaZzGaZzGaZzGaZzGaZzGaZzGaZyuL7ryFQDXcwDOPIlsn/K4JzumdyVc5XEwcnSaTumoUyyuPJserk+4ejgnj6b7Jhyu8iQYufIoXtd1oXh9YSxUboaVJznFD/JHUTt8yuPqiSpOfZFveapsyf18kW/9vmpvGHnUfNdc1+ViFPFSyNrmm4ohtqi5YfabMPK49HGTx5Up7XvzlSdUbQhTF3X2hqkTnL5UQr73NskzBEeP5BkijDyVJ5/PXVJ8Er5iozG/ASChnMGcjxlJZHM+MsWVp/sIjQtv0FbTRzUojKZx3cd5dDKyWfp7TblxGz6OL4IfG7HhU+VL8XE+DqNi18UVZZ/Nt7p7to/ySD4KqtptixUucWKVi48aV3l9PkRw1stkh+6jcep8VZcEuy6XwqydJDZ146aPAkp1UrySWLCNq/JsTb6LL7ix4oM4+MLoz0ddoMaotTDVFNM6cPPMJM+EkZIv8Z9rXIfBJyGXfsI2Xx33nSsmfLocpfb7sPhMzT3Xf5yHTZ/4dLnlY31VmdR8zj5i6o3C1i1u70v1vzb5wfWSPBPo6pq6TqZeVddvcPZAbr/DwUvNc9Fjw6eLO85zkI2kz3EcWTY+Uw4FD5IovZIcdtkvfO0x8eCFrnjqgOoC31bodQB8nprYsEvkqMQ5lKAwcR7WVD+bigVVlEzBqd6jglcXC672B/FRhZ4q7qZxtdiaSFeMpb4wjXOIW+BdyLZB6chWqLj2uxawMIcrHNmSWHKRH7Y5U+WF0ecyxp3jEkuUXOrAjSPLNt8HceuCjmwHPLa9Kawttrij8l6XN+q4RLZuP6LW2kesSR6gODVQsnaqTB+xQO3hNnw20q2Pj7pFPQCY4sl3XnMOaaj10cVy2Fylcoljv7o+tvWX5EpOlu/9nLvP+NhjpPnOlWdbK9NhgNr3U3FnyhXqeYDqpSmy9fk24vZupvpmq4vUfZ/Piqo8yTNfLl+ouNc9H6uvJb0PB5/EP2PyL5PJZE2BrLvmCA8z3zcV2p5i84dKhbbv4+aPYrM3SIXAKtFR6NgstrWU4vFtT6Htt9H1VqslVGzYx3M3HF3vuVvoPqQQZHuQKBZ7Cr2vFHoto7LH1a5C+0Ol6229w9K1tHfFuadYOpBS4Cqv6RQmOGbS4xMPpct0ksPFYVtIE1Enc7ZTO85poWl9dSfelB6OfZQ8lV+im1oPjhzbyRoVLybbVP9xTvwlmKl5lP2ca19YJWuj6uDmIodsJ/YUcWqhxD/SaxtReEyybPglJ9HSWmYj19inyDVeclik88P6wKdsaaxL9UlrjS02Tfw5kswP8ruOq3hcxkw8LrHguyEsZGzb9h5JbclRMT9AUL2CyqMb86HbdE+Xy2FqjXptWwtuLNjqDbdXltY6Ha+pZzGRqXZx1pjjHw5R/uHMkewhEv9wahm3l5Q+P/jg0+W2br0l+6W0T5PE91W6slF0XkyKolDns/iH1VVsG5WOwjTDYU45gzIKQdfC2kjJVFxNhxw+7XeNIwpPVGvEketiTyHx+sTC9U+h8yesjYDbV1byGT/qw7V0XVztDFs3pGsjtTOMLnVujqg3M0z+Cbt/uhA1N4o6GnYtAWjXVmpHMVKh9gmf/slnvkVBPvdHH3mZL39yDl+u5eevQuqMkvJZ9+J2lrGnHNQJg+2USZ1vO9lT7+XmU/qo0zHJCZGJgjKoRXKZb8On2i/Ry5Gvo1iM/gE7032TbbbTL0p24X4ZqAAAIABJREFU2LkS+03FPwxx9HNjRzrXxMM9nXbNnWCsq/keHLflvomH4tXFjqkWUY2+LnaCecEh9YHAZocpdk25xq0dwTk6vZz5HLu58iX+kMZDmL1AXV9dvJj8oNOryy/uIYFuvk4XJSOHX/LOOqXf5Ftu3Ze8+6Xitu1HQb05fmr9qbHcOlGxoNOd4zfVPRt+zv5jujbNNcWsrS6Z7OXWY2rtVd+aXvvCbMIkGZfI1uW5TbePBt+mM0wvFby25bYtdiT7jut8aS9ny0tq/W19hQ03x59ckjz8S3LZpXcyzXfJQ1svYyOJD6XzpX2YblzSF0hJnXvVjwCqQHOAcn91QRzc7GwLS22G3FN09RSNarLUJsLWnKn3bE2fWghdcFH+0TVBJvk6uTb5El/o7unsDfJSG7q6vjZfqxhs+INk853JNi5W3T210JnyR4fbVmA560D5k7LNhIPSbfKFqpP7sKpe63xn84XOJjUObLJyvJTvOL6g6oYORxCPDrPJXpN8U1MmjTsbftOYSX4wHqh8sDUrNp2mWJDgd6mdOpLW1ZxuSoYphlUZHNtya6HusxR+05itNwjjO5f8D9prks+xV81P7joEY90WfzoZlM+p/Z/KH5PvbflP9WFq3yatF9x7pjFbn6ezUWebq25JLdTVY6kvpFht9qpjJn5brpjijjqgkOCXrrMp91TbKFxBvZLaQGHW6ZbYZLpH1RKdXFsd1vUZ0jocvMfxdfCeLsekvgjTg9tqg6nHt+WDRLetvujqikpX8GRNHIZJ3I1TDQxTwAHmzYWjW1eMKJwUcW0wjZmwBO00BYKLHoktEh4VI1Uwg0QlNWdtJOsmiRHVBs4aUQ8MpnlR2KQbs/GpmEwxJY1FX3Zx8HPi0oTXttbchkbdMGzxRuWnJHcpHSY7TTi5tktssGFxyUupfZy1lWKhKKo9JUecptGGwRWjjVzWL0i2PsBWh/OFn4o7ld8Wk5QNYWNJkmvc2kDZJ7Gdwiu1U3ct3UskmKia4lr7wuKUknRvCBK3P7LZYNvDffQNNjtVm3RjKhW6dupw+qid1HqEtYHika4fZYuK37W2uJLUB1RfBfD3DZ+1QUdj/heAMMnpi6LCYFocSVPlswHz0VAWqiF01VcMMXMt4clHAxzFPIksnzkTVV674pHwuuLxMc9lPN/zxvHkt5bbMES1FxbDel2PeHxSIWoV4P8BrdhysdjkSvye7769UDp8rFGh9+kwNlxr++I4HnremP8FQKIgqk3I9JBg4qVO9HJjqhO4NlPzTHg4uIO8XPw6HTb7801S/9hIZ7+OxzUWo45hztqY1pZLHB3cDdxlngSHjmz5F3xtqw1Urqr4pHUvrH9MvLomSxI/ksaFwiMdN8n3mYthcyM4j4vfpM82LsXDIYn9Uvsk41SMmkiC1yTX597mmquue2w++yMbhfVj2NrpwqvOC+NPqn90xROWJPtJlD2erUfl1k9pHHBtCvK6xpoEu88e3xe2KPNXKtt3j8+ZF8b+fNfvKOKH6u3Cxk9B/xeAfFAxnJjnqJiw5KgYMY3TtUfFFkdRvWsUlorNT+M0TuP08aXxejROPqgY46gYMY0TTeNrxiNffmL9LwBcymbD/8q+b/IZTKptnHeofepzme/z5FaVzbnnQ66U1/eJqYvcYsiDfPrS9dMdYYj77gXF64pD+o6qrwOJfOeYREYx50e+czqq2iTVx+U17RWce2E/fWAjCbZ8yJV+sssVR1Sk+/SFVH+U+780vrhyw2CIEkcx902ST35F2Y9xZZg+WeQLmy42r/dYiQpHFBRlLS0GP5j6SFcc8aDDgkJ09233VDDceapeqS71n0S+aUwng/OxRp0MEw/nvg6/yR+qTlsB1PmC2nxd1lDFbfN/biPhrL3JJ8HNyGXt1abItq46uUEZtvzQ2aHzm2m9pHJ0MtRYscUBZZM0LlSi1if4Wo0VHT5b3KvrxIlxl/jXxRRlq2m9THHFyTmbfm6Mq/YEsZnikspRjk5bDtnw22RSWE3jlHzTg5WkvlE6TXGhs5Mj3zTX1Njb/ELFnW2dbL7l2GmSEeRRP+Jsi1mdvSb8OrkcO22xYasXOp06map8U/03xY9ujzXFPDcP1TXR+cXmCx1WnU7dX9UWyj5OPaDqi8kvuvsc3BQ/l0x7FIVf9xF9Ww2w2WbyuyrbxG+KWd09XT024Q7aq8pQeaV1U2cLVdO5PqB0qWOq7CAGGz8HB4dfV0O4ftTxUDg4/NTa2+KMY68tPrm1heovKflXfQVAF3jccdvcQlGUmMPMl84ttH91BVnHc63FR5Rk8wfA+2Vdl/Ew5CKbgxdwt9cVlw+6FvWGnQtEF5vXYi0o1n3EVWaUmPMZHypvoepqoWLgestVTp/BkVGofbcQ+/K1iNnHXF3uc3QV0l+F7JGvt2eOYqtdxUCS+LrqKwA2Z1Hj+Xa07VSHOlXKXXMeWEzXQdkuJJ1baP/aPlZtasS48jn+vtZIkk9Sf4UdV08RXefmyGaL+o6bKo8T34Uq5mH1SmObU7ts15LYUsn0Tlxw3DY/zLiUXPwjvY4y9qKQHfUaFCo+dPsSNT/KumnDISHX+b5z1fe+7eL/qGOzkLUtjH907yzbaj01bttnpNhdsFEk9TU3bvK1fxW6R+bUSooK/fAszVVpn+O7TygGkvjL6UcAr6dTlWvdlihPV/NB+cBQDHYWM/nwz8fdxx/3k+jrxb7rxY4oKR/vUgGyJruY1szHO9g+ycU/xfqO8MeV8ukz37quxfUOYi62fP6407UYT0EqJvxjPgGQzZq/N+dCOnk6+RKdOV7fOLl8HF7f8ii5uhMwk0zX0zEf9pjiQHpa7sLrekpI8bnEgS0fXE93w9rDiSHbPZsMrr98rA1XbpjTdM7Jehh7pPNcarfP9fGdY5z4c5FrkmmrRyqfjxpbyHcPwqyP7t1Cn3bn3vUplC/D1hbdu1Y+6pWOTyJTwuv7AZAjO4raz6UofOmTT5IP0n2Hu5f51MuVyZHrWococnn4jyouw9QC389furlR7MsUv8snSqLsM2x4dfklwSldM0k+xINMto94S0Do5OXu6fgkMoN/Jc7hFjuTHLUx4TbDJuI2ClQRktij08+RxV0fKn44cWBKdm5C+vr4F8Un2RCC/Lk5ko+scZtIyfqY8HFwcu6Zxjj+kjbOVK7oYs+WK2Fyx8TDqVcUFm4tc3lokpAp7qnNhrsZUvdN93zWYBO/zh4bf9AeqplQH4Rs/K5E+Yezv3Prk84WExbpw7GkIeTw23Rye4KcfzgHqNI+g8PL8XmOzxRrHKxhm/xgTlBr5Xsfo/BF2Tfp4tzXvszFJ4khDi8nZylZnLwN8kow+iDX9VH5bPWGsyf6WJ/gfBtJapNurk2HNIYlfaPqc6kfXJ5Hqdphk2fDI8Uo3Q9V0v43gKaA5AZ3mL+6B2x1o7LxU7il/MVgv05P7p8Pe7jj1Pq4yvOBO59/pfbn+E3xK7FTHdfxcw6ogmPcDZvCHuR19a1pPnWfY2vQTmrtOPjDzpfw2ezJ2WQiaSyrG4qLv3Wbsc0Orl9sByISu3N/g7mpm6/6x5b7nGbEZK/uIY3i54znMAWvKdLJ5NQtaaxI7wfHTWugizUufxQ1K+w+KcVNxY4JX/Avh9+HX8Laafqb41fn6eJXao/UXomdUnvC4jLFiulaZwvX5qA+zv4iwcfJfe58wLz/Se038ZseynRr7JJrNvtsfNL7Ej5JbSq0fFWOTq4t3kw1h+JTeSXrw5lnsu3KbwCoxTHIHCxG1P1gsKv86jzqtQpULYau+Kj7OnwckvBzeKX6w5LJ7zqfmea6+oy7BtJrqTypPZL5ug1GfU3xU/pNsnVFSlckVRncHA/7mhrnYtX5w+Qn6r5krgkf9aBHYQ0bx7Y5Ot9yMAV5XGKA2hMo/VzdJnlcrBwZHHkS/1H8kpxw2Xe5a8D1qxSTSb7UTzZ+3VxOvun8FzYWTTbY7FVxcO0JE+cSn5lso+5R4xKf2CjM/qCzXXpfagu1Tjnirin3dVisNv9R40F5OuLEncQG0zyOPhd51LjNHld5HD+52mAj6XwpprD4uPpdfcmRB8j3BMnezpFH2pvJZLIS4TqSbDCqMTqZVMG1ybvKQEuBV2WZcJj+mvCF3ZC5+qi/JhtM+HRks0OHRx3T+dgUA5KGgrLRpXhI19iGR/daike1L3ifK5OTB1LbJJsRF5MNh6lmUI0OJZPCkJNl4jfN0WHg+oVTMyQybfh0cm3zTXHkc7PmyHStjxy9puswmF31B0niXx85qsNBNShSWUGZYYiK7dw4tykKypPWJxWPKZeDYzr9nGubfmp9JLJN2MPiC8rSYQ6TK2HzPihPmsu2Oskhbiy47CuuMiRzOPuka69h02W6Z5tv22d1fDb8Ljbo6qNKYfs2l97PVgNcYsNUt1UbKRk63WFzTbXPtbZxbLHhUTGZeGxYTDaO+V8AuMnkq9nzrS8f+KUbVVi+YvdHlLLzIc+XbK68YvKHi+xiir3xXAyvz7c8X/74OOdiPvSN19Zo5UWp7+OSi7794YuKPfaizEXuw2M+9mMXuh739XzIy/c6calQ/vAlr9D74lU/AqieYKj3qIQP/uW8Dso2YaBORNTXOh6uDkqeSYeOx2YnpSO44VI6TPc46+Rbh6pPFz8cGVy/cdfOJM82HsZ+9Z7p1M1Vh4RcY0US/5T9VB7bbOL6IqiDExcmDNz859gkrU0qhalNPmIlaIfNbyYZNjwmv+keOFztD1ubJHuXSYfPGsvdmyl90r1SgpO7XiYeKa8kHjm5aYtHSi5Hh6luUPck+sLUJh/7FBevSZ9Ohim+pfuKdG1sNnH3Sm5t5u6V3HizrZ20h6LWztSb+97HdH289DUnVoL6OHK5dSNILvYHZfuKY8AcK0EeaS30hc30WlLzTfO4uSnFps6z+S3sHsPRR+kY8wmAMQOG01/btYmkcjhybTzScd/yOBRMaupvGB0SLIA+YHRYTLb4xONLnsmPUv9HQSYdXMw2flcM6iYh8Q83VsLY6NN+F+xRygi79i6YbRRFDXfVb6pV+YoNn/WCi7WYalXYfSuK2AB4H4/Nh59UPcXUN4Ulm18L0Vflay+w5aaOT9dHqdc+Y0OSkzkMXHt9Y4lyH3Otl777ToD/lZCociUfe0XYeHTR4YrRdZ/yUVd8+T5s3wDA/hUA033Jhssd5+o1yZDyh8HmSlEXHR8+9qk/HwXeFVu++H3d1/HlKEq9vtYsyhyTxg1g/h5umDriQqYmQccnbYQlc3n8KXSdPoXjXcOY2HYjptaWsHXmq8b6omKuL2FiQcrPyX9A/h1FV5xRySgkRdmYB+UXinzWgmw2i/ToCFKIozSZRDwerlYX+z6fL70++pGoH+ol5LKvFqoP58gI+heQ/z5FVDilJH2Gc5XlIiMfByO+KYzPrvoEQJTAqMDlzPeNxzf1nH4H/7Ljh9g4eByIzcPDs7+CTy6YhXJHHMWeDNdTU1EoUjH3nj6MN97ahON9l69j8VI0TLsZ9/7KXEyqKkUY6zgPtsMXjuH1t7bg8NCNePpzS1DrUTY1z3dOcGtNMTWLYfx11dzMKE5/sA0vbzyMwSs3E6icOA0rly/EjU2VUPpmpm0D2PWL5/CTfRdwxxO/hqfm0RES1YFeFHtJofVL+aPCq/KeevsF/HzvRQ1nNebfvQzLbpqEMkZjzdVv47fljo8HrjD+4vCHeaAKI1PCL9UP2H3QvuM1/OuuMxjJBO/GMXHKTVh17xJMUpslANlsCh3HduG1dftQsfABPHJTFd555afYkZqJpx5YghsmVjjbxiXfdcxnLIbpg6KIRQk5587weWzasAW7TlxEOsgQS2Dy/Afw1JLmsfwcmYyxfPXkVA0Drq19p5AHEtJnmEI/Q7j4C3D/Id2k0ywmqaCkIH0vRHQLm8HAsefxjef/E17u6UI2mUEs+xbWHv0xtnc9iz9bOR/l2WFcGulHLF6FmrIyJEh5WYyO9KI3lUJ5SR0qS+IsFD7sC8qwySv0w3bY+CoGUjGP9F3CwX178F5XCarKSwBkkHl/P7a8exK/99uPYEoZHTkSXUAWmfQohodHkU2WoaosifRwH06fPIr9/bUYDSWbtx5XTiKZa1coPt/8vv111dxsBr3nT+Ldd/dgqLQMZckEgCzSmQN494Oz+MZvPYqbJpTTMrSUwfBAH7q6etA/tosn8XIoKl4uf6H1S/nz5dv+c6ew/2AHkE5haGQEaZSgqqIEQB2ab7sNGUaMj5GZzSKdHsHQUBrx0lKUlyShiqDw2nJHknMSHT54JfyS2hhlfPnU39dxDDt3fYDReDnKS3N9TRyT0YBlaf2cWCyDwd6LOHLwCKqnDSI1Wor2w/uxa7QSD9199aRC+Ssq/dI+LIrYle7TvvVfxZ8axKmjh7DjvXYkKiqQzIVSLIHU5MGr+R0xFOoZxkcNi4q/GGqjL3nF9gyRb39ddQAQ9qNZNlA+T1h8fpQknL4ubHz37/FqVwe+dvc2/PHKOSjtO4zvvfbHeLNvHfa3NyNz+jt4dN1fo67hN/FXj38V9zbehIpsL4527MGJkR4g1oAbJtyEGY2V6Lm0Gz958d/iD4/tx6MLn8Uf3nknpmQOYUfPJUytX4GZdSXov7ATW7svoXbCUtwxsRpI9eN4xz4cGepGPNGEGRNnY2pNBTDSg4Pn3sOxzBTcM2UayhPmwwTXdyV9ka+PyklkFxMFP4yTnfEA/u9vrkR2sBObX3oez258C//04hz8h0/egO6OszjXE8O0m6eiOjOCzo6zONeTwuSZ01E+dAln2i8g1tCEZE8XUNuMKQ0l6Ok8izNdg8jG4iivacCUljrERy9g+6uv4V/f2ImBOffhG48uww2N0/DgY5/Br6RrUQMASGOg6yJOn+vCcAoorZqA1paJqC6NY7i3E0dP96O2eQJi/T24OJBG1YRGTG6uA3VOUQxrEfbTLbaPF0rfYQvK4hJvXiWWPvklPL18FkpTXdjyyi/w43Vb8JNNd+C/PNKGkYEetHdcQO9wGvFkOSY2NaFxQgUSsSxSQ/3o7OjEpcEUkChH0+RWNFUrGEZ6cfLMOfSOxNDcNg1NZWl0n+vE6Uv9yCCOsuo6TG6uR2VpArFMCj0Xz6H9Qi/SJZVoqC1Fz7kBTGibhKbqMmRHBnHu7Flc6BsFkmVonNSKpppSxAGkBrtw8vQ59I9mESupxNS2VkwIcRgm9aU0HlwxFKLO2ebMefy38LePA/0n38X//tHPsL3sAfztN1d8ND81gJMnzqB7OINYSQVaWiehsaoEyKTQe/E8zlzoxWg2hsoJDZjcVIfSoXNYv+5FPLv2CNqWrcCjq5bj9slVGB3sxdmz59E9mEKstBLNk5rRUHV5/aU2hv1YZ5h3woJ1PB/xkO8+KLSO0iosePCr+MaDNygDGQz2XMDJ9ksYyQDJsmq0TGpCXUUSLdMX4PPPTEOysQUl8aExs4a7TuPg2VE0trSgua4Co12ncbB9GHXNzZhUm8HRI52Il1ehLDmCgXgdZk2qRXq4D2fbO9E9lEa8tBItrZPQUHm5HR642I6T5y7HbGlVA6ZPbkBJPHyzfS3se9L50msfGIKUSDbhK//nf8TyhoDsbAqXOk+j/UIKjS1l6Lo0jPqGCRjquYieVCWaqofRM1KJ1klNqMj24sSJDvSNZhErKUfzpFY0VZcAI3042d75Ef9oJVpbmpAc7MTx9i6MZGIoqaxD2+SJ7DfofNjvu5aFfYc87L5pI5+fPgqr53qkJEAnKfevjnS86v0c6TZrGy6dDgqDqid3TdkU5DM169kskIyVIxYD0pke9A6OornmRvzap76PZzJZ9B16Dl/a/Hc4O3wBZ9v/G/7i9SxmPvoH6Hrvf+CP3v4uNg2cAWIzsHLal/Anq38HmYP/gL85tA0XAHxv5++joe6f8LWh/4qnt76Jr6/6AH+0tB6ndv1XfH7LetyxeBNeuH8qDuz5Nv7L6/8PXu45gURyLu6d9W/w56u/htnDB/HtF7+Ov0z9Ok599XcxuaLEmNA2P5rWSreeQXkmv5v867rBmGSrWEy2SrCa8Kikw6fqz/39SE72w4/6x1BSNQl33jkfm94/hXMH9+BUXxXeW/tLvPhOEr/7N7+JeSMXsGntL/HiO7348p/+R0w/+S5+8IM16Gm7GaWdZzFt5SfxwORuvPrKerx97BKysRLUTZ6Bez/xOJbV7sfLr+xAO2KIvbcO341PxG8/XILnn30O2/oW4S/+9HGUdR7D+lfWYO3uE+gZBqqa2rDsvgfwxJKZ6Dq0Cf/vP+5C4y1TETt3GofPj6BpxkJ87jMPYsHU2iuNOye3wq6zjpf6a+O14VB1u8RsMO90NnLrr9YnV5R99CJeVoe2KZNRV7kP5zsuYqSnEu9seBnPbzqA9t5RJMsnYNbtd+NXH12Ktuo09r75En755ns4dmkIKK3D/JWr8Kl75+EjSuPi4d34/o9fRUf17fjNX5+E1Mm9eOWlN7Dp8DmMIonalmm4+5FH8cTtrRg6fwQv/exFrN/fjlTFREyfWoX294dw/29/Ho/OmoijO9bhubXbcbhzACitxby7VuGp+5ZgWu0gtq55Hj/fuBfnBrJIVE3E8nvuw+MPLkJTCR0Tkn1L0ria9g8OcfceHQ5bXrjGoa02GSnTh/c3b8APX9qI070pxMrrcevSVfjqpxcj3n4Qa15Yg9f3tWMwm8DEKbNw3yOrsSK2Fd9bsx9ZAB+8/Sq6K6fi1kemYu/ba/CzdbtxsmsYyaqJmLfsHjx1zwK01ZWK/UX5JCcr7FoEyeY/iWw1jnR7r85WE6k26nCqMnV7uU6Wa93V2Tlw9jBeX/caXtl2DL0poKKmGbcsewDPPHITOg5vxXe+swE1j30d31zWgEBhQ9e+V/GXz13EI099Gk8uvwFd+9biL394Gnc/8QQ+t2gU3/3/foaB6nrUlPcDc57EH6yehgMbX8DP39yLk13DKKlqwuL7HsInV8xH0/Bx/PKnv8CGvR0YzMRQ1XQjVj/yGB6+oxUlGswmH3HW2iX31bVT9et8resxJH0JhVN3rcNPzdHZ6kJXZIz2Y+/ba/D9NWcw49ZqnD2XxMOrl+PIphextaMGN7f0ob9uEZ5+cinOb1mHn72+A50DacQrJuCWRXfjV59Yicl9x/D8c7/A9rM1mNPch/6GxfjyQ3NxYP2LeGnLUfSlgaqJ03DXqtX4zMoZKBH4j7LZ5AdbDFl9orl22S90Y5StHF0+927uPqZem3BS2Nl7pEZWPvZ9juwklaSqE4Oku6/K0clSZeT41Xs6flWvqfCYrk16TDZRdo/FMAELF/wmPnfyffyvd76OnacXYXnjo/jsHY9jfnM5Kicvw39e8nVsXf+3qK1/Bt9c8SVMSZzHtpMDuHnKb+Fzt9yC0YPfxR8d/Ef8/YGv4K9veQa/dWwb/uTEB3jotj/Dr82ZhpJdhG1dh/Ctnf+Edel78Nefvh/dB36Av9v7Z3h22iP44wUz8ZUH/wbLstPRUDr2Ax/cdTXdt/ncxENtZJRMKvF1snTjEptc7KPGTfKuljH2uqRmAmqSpegY6UXf0FiWmH4KunrL8JVf/RTammvRufsQeuJT8dSXHkP1xUN4462teHnzUaz+0hzcf99JvPjWbgzOXokv3D8TlTjxkZDRfhx8dxPW7uzAlBWP4AstWbzz5hvY8PKbmDGjBTcAQGwYval6PLR6Cea9/ype3Lkf7x6+FXMmT0B14A1a1VZOLJkKKycmuLXMVKNsG43pmsPD2eApXNTfK/OvegFkRrpxur0d3YPAxJY6DPV3of1sP1pvvwePz6jHqT3r8cqOd7Hvjtmo7zuCX7y6E5ea5+HTD89H4tRG/GzrNuxsa0bzh/JSvZ3YuuddHO+twcOfWYmba9PY8945XMy04OHP3o+moTN4c8NbeG3LYTwypw4n9mzGhvcvYsqyB3DvjGq8/9ZaHIxVAQAG+49h7QvvoKvlFnzuoTlIHd2AX2zdiu1tbWidegr/uvkQStqW4JnlrTj8+gZs37gBU26dj9U3lGr9KvZXiGtzHuuJg1MdNz3sSeqVy1ybTf2n9uBfX9+Koba78PWlzTi5YzM2vP0q3l40F5OO7cKmfX24dfUTmF/RjQ1r38CazdOw8LGF+Nx95/HL149j8uI7sXrxVPRfOo2tb+1ET9MCfPmx2bi4+2W8uHkbZt/Yhtb6yWMabFcbuT6QxkjYfVSHw1YfTfdsPNxrk2yTvyibrpKZGsLhbS/h745XAgCSFVVY8tATmHq+E+3dWSx64Enc2jCIrZs3YfuGd3DfAzeiJAtljzPUO+11GiPJctxy5724bc50DHW+h+dfO4CSOUvxzII2nHv7Jax9eytmTrsBN3VsxIaDPbhx+SewYlIXXn7tHby+bhvmz38C08vofSlot8QfKj8n13XXOtmcuRROyTNBELsJn8pD2ULx5yid7sbaH30POz7cBhJ18/DlT878UGg/BmqW4+l7p2Fq5SCOAMBQH5rv+ASWTp+EshPb8fz6Xci0LsYzK9pwZvsmbNi2Hi9NnY2vzflQ93A/WhZ/AkumtyJx/C28sesUWhY/iqdnDGH9+i1489VNWLrsRswslfUhwb+2wxF1DsfHJr9KalZwnPNcZMLDqXcUdltdNtmnm2PKreB8F1u5hwE6H9v8I/WfZB9LShbCpjh4X3IqYuOzNcfUnKjsG/s6gbq2B/GnT6/Fo7t/hB/t+hf88Mxa/PP+v8XvLP8O/u2SWVjeugCVyQo0VC3F4rZbUZ0ewJ1zF2LTm3+Pv1r3HfQMX0JXKoGzwylMbJyPhXUtqDh5DHObV+C2hlp8QDoohTKUoDR1CfHBm/H48r/G43cDE2unIFFeivkzHsJ8ix2UfTpfSoqQTr5tPmdDpLBzT5ipRKfmhj2xtp7HgoNbAAAgAElEQVTcjnkdy01iy6+5cS6Wz78JiWwatTdNx95D67DuheeB9Aj6+jMY7R9GWUUDpk9rRtVmIN14A26ZUY/+Ux8dAIwO9OHkkaPoqZmNry5biAUtQOnwGRz+2W5sP9aPGyoAoBRTZs7C4oXz0d/Qjne2b8bg8CgyGUD3Qxdcv3EaYOq+iST8VGxI44UaCytfO//Kq0Fsf/6H2L82iVg2g+HhYaQbF+JTyyahsmIIs6a34v3NO/DTvWmMDPYhPdqAoXQKl47vx7GRWqy4fTHuWTYHZaMzsfjBDMorMth7AMiMDmHvW2uw9+I5TFr+Kay6aSISsQym3zgdkz44jE1rX0YmPYr+vgxG6oaRGhlBx+lTGKiZjpVL7sCy6eWo6juEncc7AQBDJ/Zib9cgUoN78eLZQ8iO9GN4oAIXu7oxMiUNxICRgUGkyyfjgS88jdXJctQ3JK2+4vhLOt9GrutPzZPgleAJNz6C0x8cQ2f3ILp73sFP25MYGRzA0Ggax8/1oAUxxDCCSxdH0HLvInz1ptsRr6hFU2055k5rwIs4ifrWGzBnUg1wPoZYDBju68VIaS3uevyr+JVYCerqJ1z1PUXp+vkml9ok2Wco+Wpja5Npw8+Zy+ERxU8mjb4LZ3Cg5/JnxEqr6zBzKIZb22bgpqbDeGHrOuzNpDHQP4Ds6CAGkb1yADRGLokoSHHUTZyCRYsXYFZ1DIdf242jA4MoeX8HfnHsPaQGejESq8DFrj4Mp4F4NoOBgSFU3rAAX/uNRSipqEFDAICkD5Hw69bWlXzlhC22bW8C6uR43bOzI+g4fgTnP2QpaW4N/HZRBebcNh8Lbm4Ezu0FAMQTLVh613zMTQxi2zun0T0KLFxxP1YsqsFodQ92HtuAk7sP4NycRgBAItmCJXfNx9xEDGdOAfEYMNDXj9LWW/GFr9yKRFkVGkv0PbMOu+ubCsG5nL2F8yDqep+7lpK+nYNBwh+mXzQ9/3D5AX2dNmHI196ls0P7I4CchgCwnybpeLnyJQVDctJuwhSUExzXvTt91UadTiMdi6NmQhseWPF7eGDF7+L8wefxB7/8N/i77X+O29u+jfvGKkKqYx3+j9f+E97MTsGClrmY0ncUFy6dzw2bLMVwJnX13YaF+IN7/gLN73wHP3zvm/if6/tRV7Maf/74H+KeitKr+TXrp7MvOKbzE3UdlGfST/Fz5krk2+LPpViGIdvGEBzNDA9gKJNCPFmB0lwjkk0jfXUoXKF4IoE4gHTvKaxZ8yo2HuhB28w2VKR6cWZ0CN0MjKlUGn19g0BFJepLk4glskiWlCKBDIZHs0AFgCyQSMQRj8WQKCm3/Lgl/6TYJeep+WGaZKks6ZhkA9ONaecHXlXU1mFSXSXi8QSqGmdg1crFmF1XgjP73sYvXtqMjqpJmN5chaHuLAY6Ls8aHhpGNp5ESUkpEvEYkmXVmFgGAB/+9xSZLIb6hxBLx1CXudyMpwc6sWHdWry++wImzZiK2tgQOlKDuAAgnc6g+0IfUFaOCWUliMdiSCaTV3BmhwYxjARqauswaWINkjGgDZWYOrEKiclz8BufHsSabcew9eXn8MK5HjTcsgpPf+ouVJXYY8W14eKOS/iptebq8d1QuY+nMTycQiYDVDQ0YvLlAAFiMUytn4Bbbl6JJ4dLsOPoAfzgu5vRPViBhQ8+hqeWTVc1oLZpOlY/+ShKtnyA3W+8iFcvXEDV9KX4/BMrMac5OaYehq3HYQ9QbLWLe5CjzuXEgdqT2PhtGKQNsVS+dn5pFW5XfwMg3Yeda9bjlxv3IdM8DVNrgPNnz2KoKydEoyd4kc0gk0kbDgViiMfiV3AMDw0iG0uipq4BLfWViKMFKGlAc205blj4GL448BrePnYYP//BdpztAe54+Cl8dkUNru6k3Enag0iJK8tHLkgP9X0e2CWSTXj6D/4DljcEcm80193EkEyoPo7j8s9gDaOnfwTpDFBTW4MYYigrL0E8BmRSI0hdkXCZP5vNYvKS+/DFwRKse/8kXvjJHnR2pzFr+cP46qO3X/6ECsbmp6nW2/pvlTjPW5JnKql+nXzbQaZNvq1eUuPc59OcTpv/pP0cx1+25yPb+tn6T8oeHZn8qT0AcG2obAcB3EbHV5GwbcKmjd22QV51b/QS3jnwr9jUV41P3PoEZk8oRf3k+ZhdXoo1qU70DqU/3K2yyGIUmSzQ174Xu1Ix3Hrjf8NPHr8HFzf/IVZt+cGH8gOys2nEYjEkEnVIZYGD3ScxlK5F7/BlOQDQf343Xu7ciua5/xnPTa/F1s1/gn+/7X/gf+9+GvdMnmDFT11z7Ldd297R0DU1EjwmftMJJCdZbHy2JlBK+nlZpIe7se/dA2jvHsSE22ZhamUch+JxxGKXcKZzBLdUD2N4eASm32Mf7u3BpZ5upKpn4Znf/AIqjmzGd599+aoDgEzqagmlZaVobKxH7IOzONI9iKnVWVzsPI8BVKG5LgFkoG3MctiJQS1JNhhTjTDNkxRIEz91oh323RuX2OHpLMe8lY/g6eWzUB48nUkPo/dSJzqHyzB79Wr8xt2TsfvlH+G7Hb0AgJr6OpSmzuP8xQvoG5qOkfP78NaBPky7qQ1pALHScsy7+37UHVmH17eux8bbZuD++n5c7LqEVNV0fO6Zz2Pypb345x//HBdx+ZCofmItcPYiTnT1YW5zNQb7+q80WomGRtQhgeq2W/HZp1ZgenUMfb39iJXXY/TobhzorsDih57C7Pp+vPncs3hh30a8vWgRpt2i/CqhR//6mJ/vefmlUkyoqUSyJI4J0xfhS59dikmlozh/bgDVdTGc2H8U3RUz8ZkvPIhs51787Ce/xPqt+3HfrVOuSEhnswCy6Ll4Ch+cTmPuytX4VGMZdqz5Pr6/aQ92L5iDGc03XvVf6QbJ1i9I31BQ53FqvdrscmXr8Ehs4VJU8e/jXevLD20DONvVg75UJe5/6ot4oukCfv4vP8faLvv8WDKB+OgALvZ2YyiVRl/vEMlfU1+Hklg3Jt20FF957A40lmbQ09uP0poyHNu1Bz3VbXj88w+jvvd9fP/7r2DX+o1YvHg25lcH8EbUm9qIWgeXmAl7uON6T/JuNQMVqXcMXUnPKkxqrEJJIovO46cxfGMLLrRfxEgqg8oJ9Rizq8RiiGEIxw4cRnu2Dg9/bhVahg7hpz95GTs2vIkP7lmAxbVBdn6PapvDPSiyPXdJe3xbzfSJVzru+nzqKs8mX8qvywMJJunzVpBHHWN9AsBWdIJGmJpzyiBKH6dQSJt7dZ5U31V6SypQ3v0B/tfGH+MnB7+HSRUJZIcvYndXH2bN+Axuby0DuqowJ5bClo7/C3/zVgzfrGvD9HgG75/57/j1n30b9RfPoS+dwehQFwZxI6pKJyCd6cePdv0J2up+H0+1rMDU+C/w+vu/i89cmoTK82fQn7m8fMnsAN7d/Y/4Qc+z+OnUSRjseh/tmbm4ZXIdRrsO4Qdb/yd+nrkf3171CTSUJkIXXtfTOyowpU2Z6ziHuA+ivvRpqWMHvvWd48imBtFx6gwulszC5x+4GTWlWbTW1aIicQLrfvIDHKgYRsepLmRQoRVTWlGOyopyxNvP4Ll/+mdk+y7gdG8WiPehF3GUlpahpATofX8DfvBqFR68+aO5icpazLjpZrTu24IXn3sW71Vl0XHyBBLT78DSqbUI/lzA1WTfIKjY4OQdp2i6vjMnfYcmjG5XCtV0x+Moq6lFdWIUp3a8gX84UoJLneeQAdDXn0L1jXdg4cS9eHf7enynfR9ivadwbHginpx6A2o/1F3TMg13N92O/Wc24I2XNmLeF29DdVUlYiMdePHHP0JyuAsnuzPIVvWjv6QUk2fPwcTt2/HaCz/HoY2luNR+EiO43DlVNt+KJTO3Yu3eLfh+7wlMKI9hCNW4854Hsaj0Et56+TUM1u/BtMZy9LT3Ip5owqSGsrz4Ksx8SS3xoS9I0T8sJjDplnmYvXEf3tm9Dv/QewB1yTT6+pJ44CtPInvmMF599Rh27pmC2vgIzvTH0Dh9AkpLkxipqEA5RnB423o8W1uHp6b04/3Na3Bo2y5Ma6rF8MUexKub0FBVE/r/KpY8YFPzTGO2Nzd81hJdb8WhKB7+w8odI6OkDDVVFSiLjWD3mudwOjmEjtM9yKIKPb1Z1BLzS1rbMDmxF/u3voFvn3gXw+fPIXnV/x3xEdXfuAQLGz/Azu3r8Z3O91GVzGC0rBGrHrgHNRf34+evHEbjrn1oLh/C6d4hJCe3Ilhqwtrs/40COsZd+2Muubxby93rTfpylE53Ye2P/gnbr/xISAKT5y5Bi4pvrHIApZhx+xy0bjqIveufw7eO1KC34zT6U7VYtXwuanEsKACIxZHtOopX1ryL8vcOorVyBO0XBxCbMBNNyumk9B1lnX3BtQvTg9r6D8mbKMFxkx0uz1S+e6Mwny7Itz6Obu7zMSXTdNAQzw0G/6qUC0KVV1dg1EOAIACOLh3o4GtqvmnM5BCbDpXXaEeiCrcu+0P85LE/x+KBC9h3YiN2n0vjwbl/j29/8ou4oTwLNC/Hn972NdyGc9jd3o7e1ofx3xd8HfNGj6FzYCa+uODLWFg3GRWj59GbLcUti38Pvz9lObK9e3DkwiXEZ30Gf73g65iXOonz/bPw9Pyv4Mb6KZhQmkB541L88SPfwjca6/HBye1oH12IP1j1Xfz6nFZkRvtw7OwObGw/jZF0huVP01oFE59aP108UP63jZnWykYqr85GCo8pHih9Ej/q7sUSSVRWVaEm1odDR47jyOkuVM2+C9/8d5/GwpYKIF6J2+++C/fOn4rhC50YqZ2OpbfNReuESpTEYkgkS1BZXYWqD/+LtGT9tP+fvfcOk+tI7gR/Ve0NGuiGNwRAGJIgaAB6ECTIoR/DMRxptPPNyGtlV9Lp25XdPWm0u9KdNJJOp5NW0ki60+p0YzRGGo1IznBoh+SABOgN6OANYQjv21XdH0CBiUREZES+fFWvGxXfh6/rvYyM+IXNfFmvG7h91QosmVrF9l1HccGSa7DsohmYcOIQ9qOMaRdejJXXLMFA5SA2bt6N4+VWdHb3oK+nHaWWDiy49lZ89qMrMGlwLzZu34eOC6/HD//AbVg80Ilyawd6e3vQ1d6CUgkol9vR09uDrvZz/19vzkc+afsC50eNHE3uUdfcPI7HtdVv4P78UF5be2m1dOpXMnp7e9DZ1gLAz+tWzFm4HHfddBHajuzFe4P9uPmO6zCvt4rDx0bQNmkhPvnZH8DKGSXs3r4FeyvTce8n78OqhX3o6OhCb28POto6MOeK63H7FQtQPfAOnnhtCNeuXIlls1qxc9cBTFl0La5fOht9g0dxsNSGRVfcjPvuuBTdx/fi3UNVzJ4/7fRrtSV09M7Eh3/oU7j38gEc2r0DG7e+h+7JszFvVg+6563Az3z2A5he2o+Nm7bjYOds3PfZT2HF9FbWD9r6DpGldkPztb0wS865P6mcs+S+T6WWVnR196Cvq+0Mb/vAYnzmxz+Fm+d2YN+2Ldiw7SC6Fi7Bwv4JWHbzXfiBWxbj5Hs7sWnnAfRfcQt+9O6rMbmnFVPnLMftKy5E+/H9WL91P/pmX4L7fvCDuLT7JLZt2YJ9mI0PfvxDWLF4MloE+6k1KWY/I/GHfE1t+Hxs3Jikz7JHCc238MRi9MeoOS3tnZjQ04Outpaz55cnYNn1N+CmpTNwbPduVCcvxIrll2B67yD2HQRaWtvR29uDntNfYHR092BCdwdayiX0TV+Oj9+zDP2jR7F9Xwtu+PBKLOztRmd7K0rl1lPzutrRUjqlq2faRad627x2vLdjKzbtOoyBGQsxZ2ACFqz6BH7i9oUo7duB9VsPoGvuCvzUZ1dhZtvZdmjWdo0/s/qa47XMD+VnaG2V9sxSrprXNOdeqdSCjs4u9Pa0Yd+2zXhn4+l/m7Zg+4FBtLV3YkJvNzpaT//qx+l9zYTeTrScltM940r89E/ei4t7j2PrpndxuG0aPvzZT+Ouhb1AqRVd3d2Y0NuJ1tMHBvOuuxv//t4r0X5gB9Zv2YvW6cvwkz92J+a0nW1H7HMKNb/mQ+18Kw8Vn9AzkI/JYk9sPmh4JB159lKXqGeALDqo9YV7vpIwcs9CperpTy5Q7tTJdzB3esGNaXVw9zj9/pwQNl8GlxRcoliwaygkK6UuSkaMfqsMah4Q9qXLJ2HT3vP1+7It+lPkg4/RlxeyK5Zi6jfl3FgZVDws+otCKXFa4xXyoVWXtvZGjh/C5i3bcHi0BaXho3jp0Qfw/QOz8NmfvA83XTgZZYNPsvZHy5ox1ihL/daDrPpT9yOu51pIuz5Kc7V7La1OLY6Q7JCs1D240fmopZT7O2o8Rd2m6IUcNoDe61jka+ZmWWNcfgqvn7vUPtD6DGCpVW3tx+6bQ/otMrSU+vnFmiMx8craR0MxpXT690LYXV21uRKWGD+d83ZdbYAC4woPJShFvnJOB1WwPr8/T9IvFarP4+PQ2OLy+YHmbA81fQqve83Z4M4PERVXfyxUDBoZLj5tLmnlWvn8OHMk5Qun349pqLFwOaBZADh5nL1+LktNiZIl5aJ/zTU9bpzSE7KFqzPK5pAu/x5Vuz4m9z41Js2laivG/1zPpMY53CHy5cbUY+3z8LF9eP57/4ZH1h3EcBXomTIbKz6wApdNn3jqj0caasGCiZKl8YHkc+smQXOt5QlRaKMQ8k2W+xJR+qV68/Vw/SpUn9w6XcPi9hOKOPlcPnCbuposKgdj7QztCSi8lr7FydD4S5of0q+dnwc/IPdZd5zSw+1fpf0Zlz8uWdcSLk8oPJr1UWubL0Naoy22c3Uh5ZSmrly/+PsPbg8h9UXqWvIV51ONfs52zja//ikZVgqtYaH1WcOv0U/Vp3ZvwmGx7D+ke5xOKRe5ax8XtT6o7a86WSU1qDwotplnTViLPsDui3riq4eeLPrqiTEmXlnw5b0ZqTfF5nttbpFzI4bGQn3VS1eW3KhRZfgE3tu9E7sPnMBItYSOCf2YM3Ma+jpbjH8uksc4XnuNlVLEq166rIce9eq79ZrXiH2XVddYyqcYfUWt45o+oD69phG5kdX/RdpHjIXcBeqHr6azqPV1vsfrrL8BUDsd0p4SUkBDc7QnvtzpZei0T6PXgi90Mkd9rie+0P0Qn1YvwJ9EuZ9Dp68WfJS8ED7qRI+bw+HT5nkIu/85pCtFTmThq/lPIy/GD9K8FHyN0qu5r8Gn+UbBIk+ao6lll6jasuIrt3Vh+pwFuOLypbjqikux9MKZmNjZAiTMXw2fVp5GVyPwafRa42uRXfscszmR1nX/mptvXV9D8qTrGL4YfNr6iunHFD5LLmrnxOKTdGlka/k4rFJ+ULKte8KQPA0+LWltksas+//QYR13LWG11Jc1L634LHyAzn+p9MbkIhevvOo6FF/OJgu+GKxur0lZrxK+mOeTPPGVKQb3p/9aAcVTM8xvWNQcny9UqKHiovRyVNtkUK9KhPBJhea/ZhGyl0tyd6z2mdIl+Znzn5SQIT0uNu7alUfZReUOhY+LjUYehY/LRQor5YfQQkTJo8ZCNqaqFUsuUjZx8qSc9XWFbKLw+fXFLeqSTS75WH15VB1KORfCR/lBqj0NPp+4MT9OGnmh2uYwUPMpGRQ+ziYpt7m1SMKn6WlSXvkYtD0tdNhJyYupFW18tLXCyQ3VP7VGhORK9a/Z6IR8xNnGYbL2k1TyOJyUPJdHym0OH1ffPl5Jj2aOj5eTJ+WMdD+0F7XYFFpXJCzu2hFTr248UtQ/F5vQft23j4q7dv9P+SrUg7T7a84+Sp5PGnwcXsv+n5ojydDubUP7EzcXXXyhvSjnEys+X0aoVii8IXmaWnFJ29OouPn5xlGKWgnN4fBRPvLl+fZxeVWqVCrV2oD7kzPYck9KJI18Tl7onla+dE/CA6T7tQCpeGNkSv63xFbSp/U5NScrpfBXKj+k4rNgtMrX5n0q2Rqy1HqsrBSUQnZMrsXYnsJfsb1bkp2l/rV4Ysa0WFP5K3WexvbsWB2htYTTk7XXhuak8oMVj1VezF6I87923cuyN4rBKPHW8GbdX1rx+fq1cyT9qXBlkRezF9PiSp039X4mSIVVS3ntEyz720btl4qwT4jBk6XWU6xDlnEJa1b/n/U3AFKRxcgYZzYqScbCeKMxjWdqtG/zWJzyrqWstZZqYYjVn6fMRvu+UZudelAj+ljR41mUdS8P/fXaE6SU3+h4FyUfipgvY6XP5U1F3J9nrf8i2pSX3hiSdI7FPjaeazmr7bkcAGgpdAozngOXgpr+S0tNf/LU9E2+1PSfjZr52KR6UTPXslHTX2mpmY88NX2TjZr+S0tF92c5zHIKZCy5c305vuHSqVMsDkm/VqZWb17yufGQ/1L50+ezxiHrGVO9zqhi/Xk+UFbfZM2ZBp5TipQKl9Z/WXphiGL7V94YKOLyrzb/fK7V1BS7Pll58qTQPkCiUG5pv0WPrd1Y32WxOas+l2pvcLnXeerLypsHpdQfsxZnySFpXdD2hlTPECEK7Xljv4XXYkm1Tltrl+Ox7vGpXMpSu1lxWXlTzk0po0axa0csheae+V8AqAXKv0cltT8eahj+HPceVzR+ElI6OKyha/80hpLjbgAoWWfhGB3CkX1b8Nobz2HNqy9jy4HDGK7QdvsYOP9L9nP+D8VD41dfvxRDLiYh+zjdofnUXC5/OL2hPOFkcX6N1cvNl+ZyOSjhiqlByVcarCH9vk2ST7k4S3o4Gzg/Wnnd2tDI4myWcjg2niEf+fqoxcjvfRrfaXFQMkMbOO5eqKay5LPFPo1ezXytfkvu+/e1mLnPtZ/uOhLyswajJEMTB0sdcXZRvNRegZJNzS+V+P+hJuR3f52myFILlP7QfIu9mlylep6EU4qH1FMk/ZR8bW+T8obS59dIyJeWeGbRb4mBy+/XAjenppfaQ4YwuzI4v4V6g2S3L4fTz/lEus8dwkh+dX+68yX7XTs5OSG/h2IfwsrlpzSXwhEzn8LsyrP2CE5HqHa1+ELx5z5b6lVjf42CvwJAJWQs+Y0jht8io97zh49uxtcf/Ty+tOclbD98BEOVFvRNmo9rZ38GP3P9h3DxQLf3ysUodu28H3/5+N/ixTP3ejCr6wP44avuw/VzpqBV9Y6Gjsz+GDmBZ1/+K/ze2wfwE7f8HD4ycwZaE/8elDUnikRZsbPzh4/gjWdX45F1O1Ft78PSa6/Hiktmoavl1PCJ99bj0SdewPr9J9E7bQFuvulqLJrShbInc3TwKNatfRLff3MPTla7cPmqO3DzxQNoO63m2Hsb8fhjz2LDgWG0TpyND997O+b1UEhPYvPa7+OBl7ZipKUHi5Zdh1svvwDdbWUAQ9j15sv47po3sf9kCZPnLcEtK67AnL428f92b3RtF4047FqbaH+MYP+WN/Do6lew82gFk+cvxW0rl2FmdxlABUf3bsFT31uDd/aeQGvPNFx/2wewbOapPBoe3Ic1Dz+GF989impLL5bedBtuuWgALTnYmMf8PHTVU38j6VzsVVSGB7F3xya89OZbGL1gFT64dMDhP4FXHv0Ont54EKPlHlx4zU344JUzT+fKCPa88Sy++dQ7OF5tw+QFl+HOlZdielcbqtUTeOv7T+OJddtx8vQhObrn46MfvQEXTuysu715xazRvS51r8zqp8FD2/H4d5/CW/uG0NI3E3fccysu7m8LTxT0N3rtGMv17lKqWqjX/EObnsM/P7YOh0ZaMHnhlfjgykswubO1cDjzml80arQ9jdZfNAr5o+Vzn/vc5yQB1Ml1LFnlSN9IFWt+BUMHX8Wff/WT+I/vPITXDm/BzqE92DO8C9uOvIUXdj6IpzYN4vIF12Jud4czbxR79nwXf/3Yn+Gxw3uw7/h72Hl0M97Y8zC+/OYWXDzvZlzS163Gm86e0zRyEs+/9nf4r6+8gWsvvgvXTZmc6QEgazyKRlmxk/Mrx/Hak4/ie3v68bEP3YTLZ7XildUv4GDfdMzv78LogU24/7vPobzwOnxk5WXoO7kV33t1N2bOnoUJnS2OzAo2P/OvePzdAdx51ypce9EkvPTod7Cz40IsnNqJ0uh7+Nb/9yCw5AP40KrLMb91E77x3a2Yc9mFmNji4KqOYOuzj+Drb7fhox+7DcvndWHzmmfxTstMLJnehb1vv4zvvLAHS266BbcuWwDsehWPv3UcF86dgZ52/vSq0bVdNOKwa206h69awYFt6/HMut24+PqVuPGKC1HatQ4vbh7ErHnT0TZ4EE/e/whOXngj7r55ORb1HcVjDz+L6vTFmNVXwUv/+g280Xs1PnL7tVg+txNrv/0gdvYtxeIp8sFOjI15zM9DVz31N5LOfTgC3nz8K/in53Zh785tONi/BNfPm3B6dBQbHvoanhxdinvvvA5XLZ6CXc88gJfbL8PSKS04sO5JfOXFQdx6zwewYukFGNm8Fve/WcINl85AGYfx4jPbMHPFCtx53ZW48rIluHLJXEzp7UBLuX7+q9mbV8wa3etS98pMfhrdh4e+/G84Mn8VPnLLlVjQ+S7+9TtvY8bli9HfGtnrjJjyWDvGcr27lKoW8p9fxeC2Nfi7B7bgmg9+EKuumIPhTWvw8LYOXL1oiu53m+uCM9/5RaNG29No/UWjkD/O1In02gN1Tb0KIb3OoH3FQ6NLM18zHnqtwuflxisnt+MbD/8W/tuON3CkOgKXq1zqwbS2ydi274/wqw/+G/YP0/I/uexv8dYv7cC7v/w2vrvqpzB36Ev4ncefwhCAkZMHsGHLajz49v34zjvP4J19BzBUAYAqRgYPYePWZ/DQ2/fj4fVrsPnACYyeljlych9e2/gYvv32t/HYhtew5/jIGX2DR97Fi+sfwf1vP4TVWzfi0ODIKfsqQ3yHag8AACAASURBVDiw9w08/c6DeGLzOhwaGj0HqyZX3Hta/0oU0inlj4shT/1aPJKs0YPv4rWDXbj15iswe/JEzJh/Oe5ZPgkvv7UbleoIdmx9F9Upi3Hj5RdiYGAKLr/2aiwuHcH6fYdO7dTP0EG88soxXHPHzVg4fRImT1+AO265BAfXrcO+UWBow7NYP3kV7rluLqb292Pesg/h5qmb8dzbR84GdmIX1m4pY9UdV2H+wERMm70EH7xpHt55ZTOGMIid+45j+sJLsHT+VAxMno7rr1qKrsphHD0xKPovdM3dk+ZniW/e/LHjoVfE2HvVURwfGcGcRctxycwBDAxMx6WXLkHb6G7sPTyCoZFd2Ds4HzdcOx/T+ydizsIrccPiDuzYuQ9V7MIb26bh1tsvxqz+iZg851J8bMV0bNiwA5VzNBswFZiyxi9GVyimWXT7OrLIKJVKuPT2z+LXfvoz+OTyeeg96wu2w9g1uAgfvedSzBmYiMnT5uLOZTPx5ps7AJzE1g2HsXjFMlwyYwCTp8zCTbdcha7tO7ATQPXkCRxu7cWMSf2YNLEP/ZMmor+vG20tZRKHFXc9yLpvsspIbUsKvJLckPyhLS/g1a5r8dGV8zFtYBLmXXEn7pq3G99fdziTfg22vKie8vPqs7H7dK1crQw9/wm8/vw2XHDzB3D1Bf2YPGUWbr5rBSa+/RrWD8Xr4vi4GGjzPsQX6tfa/UEIJ0ep9h+SHG0sJL+FcGqvQ/clTBQfp0/r97z2H6H4nVnKuZOCarVKngr6v5dG/c6K+1n7GmuNl5PHUYjHxetj0rzy5P4uzdl8oziw5TF8efszOFQ9e3tcQjuWzvx5/PryVdjz1p/gD7b9BR7c9gl8ZkEXpwVonYALpl6FKd0DWHtkDw4f34NXnv8f+Pyaf8AjR7eirWU+bpj7U/jP9/w0Vg1047WX/gd+5+m/wSNHtqKlZSHuuPjn8GurfhLXTRnB9576bfzW2q/gpaGj6G2/Ep+48jfxu7d9HFOOr8OXnv5j/OkrX8drI8OYO+F2/NSNv4tfueYKDB1Yi7998Nfxf21Zg6G2y3FJ9wkAs0/Bq1ZRFXzt+8YSe5enJsfPPU4+pSN0XdNTG9Pkj3SP0ufjrV1Lso4eOopSTxf6ejrP3Js8czpGnz+A45UhHDg6jO7eSTjzIklrH+ZOGsUL+4cwOvsYNmzcjPYpC3Fhz068OzoPKwbel9/dOwN9pddx4BhwYsu7mLr4dtTElABMnz0Tb+7ah+HLSnjz6bcxcfnVmHH4EI72dmF65/uv5HbMnI0p+9ZhF1ox0NeJ9Tv2Yf/RCzCrq4rdu/ej3DkBXR1nv9JJxTPkr9rnUG1S8qRcoYjiD+mV7LHiC80L2eLjrZZaMXv+Eswql09/Y18FUEVbuQUt5RJaWyahv2sDtr17FJNn9mLkyF7sPFjGlAsmoIQq5k4/hg0bDmDmhf1oGzyAt7YPYdbsgTPf/lP4JZ9r+DXk9/BUlDV/YnRpcixWN5U3Z+UH85mSIWPsx00fve7MVWXoMN7ccgwXzusH0IYpM7vx2uZdODhnMvpahrB72x60zJyGPgCloSEMd5VxdMMr+Nbao2iZMA2XX3Yx5vR3nvUNXqh35xkrX5dPmnvW3NL0lZjaqcnj9kFavJxcDd4923djYOFVcH/BY8bc2TiyYQ+Glk9EuyCDI26d5ezJSlnkW+JG7Re0OajVSeWCxB8at+S2Vj7JP3QY245NwLypzhu1HTNwcf8+bH4PuGjW+74L9bcQxdaHptb8e5o6ovio+FlylOv1lv2Hr5+zUbKH+iz1Q25P7doj6Q/loqsjxEfh8cco+0I4OB0UWeN31lm+tbGl2NBRsrLIkfBkXWhpnpPYuv81bDu8D1O7PoVfvfZKPPb8/4EHju3F7P5fwJ/c++tYNaWC7+2YgMroC/i3LTvxmQULeNAjR7DtvRew9/h+zJk8DR0nj2Dve8ewYPbP4SeWXohd276GP33uy3hk2124umcSHlz7R3iz6xb8/qo/Qef2/xu/8PrfY+HsW3FZ5T389kv/gmPT/gP+7sbFWL/6D/CXr/wuPrDoJly2/x/xl688gxuu/TN8buox3P/cX+IvV/8rPnHpfOx/82v4i82bsfzyP8BnFkzGk9//PTzxvgPPev035BvNZl1qFtomoqUUG4PYh0KtrpGhEZRRRrns/LJFRxe6h/bj+OgoRkaBcmcHWs7oakNHewXHhiooldswcVI/WjtbgBMnMNjZi45qFTitu6XcgVLLEAaHgcqRk+ie33kW3nJHN8qDQxhGGwamT0FXKzA8PIyW9ha0uN/Kdbaje/A4jqMNixYsxiXHnsMDX/kijg0DPf2zcM3K6zC55+wDgNgTTN930iEKN4eirLmQxR5Xn9YeK55SqXRWvVZHh7Hr3e2ods3B9AmtaC9Nw/KrZ+J7j/8Lnj48jFK5B0tXrsSVcyegBGD5LZfj8acfxF99dxCVShvmL78WH7h04MyDmbU2rWtF1k1bVkqFV6snD7tCB27UZ3dubSyMrYqj+zbj0X97HBuOt6B/8ZX46NJ+AMDMpVfhqpeex//8u7WooITu6Qtw06ol6ANQOXkSx3ZtxoauS7Hggl4ceXcLHl09jI/eugwD3e9vTagvGqRNYmqKyQVqnisv9JAV0mOxtR7rnkTuvBNHB9HVf/bfdyh1dKP15CCGALRHYGmkPVZdln1Sqj2x9uHFoif20FAjW2Xn8DAGW9rRWXaPCjvR1TWIrSfPfQAMUdb+rR3Puu7VekcWTJa5MXgtMrLmQ0hXimdUC78Fq4ZC/tX0QsnmVpeBE0x9I6tVEPqmgRq3ND4Jp485NC7p5L89GcVQ5SRGqsDdy/4jfv6my/DxgQFMffEAfuRDP42bJg7j+0/9EX5z3SPYVynj4PCgg+N9+V9/6afw8LpfRLlURWV4BJX2T+MLt96E7gltWDL3Yjy6+v/Bf/rOZhwfOYyD1Vk4OTSEarWE1lIFoydGMHxiEm695g/x0o3dmNE3A137H8Oklk4cOr4PpcF78YP3fBmfbp+AWa2H8cXXXsZbI2/jzRd/Fd8sV3F88CCOjG7G1sEj2LXlaWztvAm/d8Wn8ckLutG2/dv48z3vRfmG9pf8Tasl73z9WTeBFttq15yd0nzJXhJTAHONSq3tmDFz9ql7+3k+4NwN9dnUidmL5qFareI4qbP2YQT7tryNFzaN4Jo7Poz5vRVseu15vPL6eswZWIYpXeVMsY6JuySTe6ixxii2R3HN3JrnlExuY3BqvIpDu97ES9vaccPdi9HbCgwf3YcXn3sLPRfdjE8v6sfwnrfxyAvPoX9gMpZPG8Xrq5/FkSk34FO3z0D7sZ145PG1eGHaHNy+sAeliJ6utaN2T2u770NJpjXXpHvcpj2F7do5ru2+Hyx1xBGn81xMQPekObj9E5/EypMH8fzjT+DprRfjIwvbsH/DK3h8cxl33/cJTGs5iY0vPYOnX9qKS+6+BC3tnZi/dBmWXnIRpk9oRWXRZBz56lq8cXARVnZPIm339VNreQp/SjGiat8yrs1PDnPIDqpXhXBItlO5EGtHiKi60vqGspfDSeHiZPu+sdqboi9pYpgilzR2hvRkwRmTS9xYqG9R97T+Co2HbONwanxjqY28cWrGLbb59R/S6esO5a91nfDxU+tR1tqMHfdt58Y5XuD0AQCXUDVyC19qplyzoBLXl83hkIrele/Pd2Vq9IeSl/LPqc+d6O+Yjt62VnztpT/FPRd+Hh+/7Gfx91cCo0N78MhTv4/fePoLeLFyEq0tU3HlhD7HN+/jmNyzCJdPmYm2svO/AMzqx77t38IfPv6beKA6B9fOXIaRk1vwyo5Tf0igvfMC/NhHvoGWF76EJzf+N3xlzXvo7PtB/OZdv4A75t2OP7v9D/GF1/8J//P5X8Z/33scF835Ufxvq+7B/uEhHMNkXDXjKkxvr33TciX6y6N449ibqLZfgb72dpRRQrl89l9U5YpRak6hJA7FyCftgi/N4e5zBVjD6cuXGplrj3a83FpGFVVUqxVUq6dtGxnCUGsL2stllMtAdfT9vzNRKlUwMlJCR0cJgIO/vQ2tw0cw4thaqQ6jWmlFW0sJ7Z1tGBwaRrXa9j6GkSFUW1vRUnXeGmhpQWWkgkrFeSgbGcFQazvaBw/j7a27MfWSq3D53MloLZXQf+NV2PGNF7Dl0BFM7Z5ExrpmryYGLq8b69p1yJ8+n58TlI7QYuDfD+Wsnysh4nJUq+dsGRUc2b0RTz2zC1fefSfmdJ+y78SO57G+dSl+4uq56AZQmngFbjh+FOvWbcTFpQN4Yv98/Ox9F2EiAPT34Z47D+PrD72MgwtvxICip1owW3wo9Wn/s3aOZvHW2knxhWpfa2doY+XfC23UNET1Oo8BVQDlljb09LWhe8IE3P6RZfi7f1qHo/Nm49lXjuKKVTfhkumnHugH7liJXX/+MF6/ZQmW9S/A7de9r6elaxLmTBzFzsMjqM6k9yGUv7VxpdaLkO8420MbSkqmdM+fQ9lB6aZiJO3hXBk+Hmmck0ONS/nd3tGKoeHhszGODKHS1nrmDwxLuSn5W/InlwvSxt6dS8mX6lmrT9O3OPu4HKJ8E1pjXR7t2mPxNzUnVKeina0taK2MYLhaceaMYGi4FZ1t4dp39WvXCYq0vVazP/V96PuTksvhlHqAdm/k83NzrOsSl/MhH1H4NHXE6afq3bc3lCuSHaHa5HD68qVc9HND4zP3c6vrSJ9RSiK/uCgAmk0gJ0OawxkeWigljLXPnC6f931qx6wZ12Jp/1ys2fNV/Oq3ezB4x2/hhxb04bln/hi//vQX8FLlJACgo/0W3LlohiPrfSm3Lv4N/MUdn0Rfm5twwzg6tBG7j41gxeW/jX+4526889J/wc/uuB8AMHjsHXxn41rMuPjn8YVZc7Hxhd/Dp578Ir6+6TZcgsP4xqENuPHaP8FvTB7Edx76Ufzyxt/H/dvuwoKeiZiKibjjks/jd667FKUT+7H/RCcGuoewsf8qtO3fik0HD2BoyiQcO7b3fZCnN3u+r2q+D21q3FiHcobzvyvLJ+3GiJorLXBcrvl6Q4Xo87n21O739vWgcvIAjp44CfSe+h8gjuzeg5Epk9HX0o5J3a3YcvAgjg/PRXsrgNEj2HGwBTPmtKMEx3cTZmDG6Ot49wgw5fQf7D5x/D0crwxgUg/QN28G3tu0AyOXzkcbgCqA/bt2omP6dehwfNU5oQ8dR3dh/8lBzDn9gubInl14b/I0zKhWsLVaRltrx5n/ghDlEsqDIzhZCf9uIeUL/yflSz8fqFhQxC0w/nwuNtwiKW0eOVxcPnH6fRnU4nCungqO7tyENa/vwPQbVmJRj6NvaASVjh50nNEPlCqnfgVlZGgYQx196Kq+fxCEUgnVE0MYgkzSRsjFS23QKH/4xNnt67fIp/h9W6TNsWufL4/DzuGT4ivFWspX6Trkd8mWarWK0vB+PP/qMVx59Vy01eZWAIyOoDI6iqFSOzrO+r9sy2gtD+LYySqGh3Zh/cEy5s6ahu5WoFodwckRwH2rV4ud8ou07ks+DMVG2h/5vByF1jSqT3Lx5/YvoXWQ4tXYxW2Ypdqv3Z82Zxr2v7ETw1dNOvO6/74dO9A+cxk6GTlcDlB6fHs4+33Z0nzJtpB+6qdmLaDyN6SXigOnX9Jd+6zpsVb7ORm+Db4vzqGOCZjVfgTbDwzhiqmn5w7vwcb9A1gylc9v/3Oo/3G1z2Hm6p+aL+mX1hXfN9L+k+OR7rvzuXzxx7n52tpz5bu5F+pXvi3+mI9bG29Kj6+PutZipbBra19aC6Q9C+XLsjvo/tMQNde/74PUypDmUHM190O2hGzn9PROX4GfWXIfLmxtxbv7v4j/9aH/gF/6p1/AL33/r888/AOzcN+y/wU3TG05M5cy7WwMZXS1zMRAexUvbfsDfPobn8J/fmEtDmMHDh07gNFR4O1X/xq/8u0fx7/71o/gv7zzHQx19GFh73RMKp3AE6v/EL/4wKfx6Qd+AX+28y2MtFyNiy+YixVzb8MVPXvxN0/+BD76pXvx0a/+AH784X/G/morliy+BctGVuP/fOLH8LGvfRp/vPEVdBD4fF9RvuOaEiWDSk5Kni8jpJ+6zpLr1DWHKYSdsqFt0nTMazmEp5/biOMjFQwe3IYnXtqNRQunolRqw8xZk3Fy13q8svkAqpUR7Hj7daw70YG5AxPef1gDAEzGJYuGsfap17B/sILK4D48s/pVlOYuwuQ2oHvBMkze/D2sXn8Yw5VRHN7yDL63uQ+XLeo7C3e1Zxou7z+OJ1a/hcOjVQwf24nvr96AKYtno7u9B9MntmL9K69h86EhoDKM7evewtaWTszsPvcPXUo+4/6FYsLxSblTu/Y3OzH6Kbs0uchh4vRLfZDTM3RoD158eyt6F16B5TO7zxprn7EAvTuew+oNBzFUAU7sexcvv7kDvbNnomfaQiw6+jK+/dJunKgAo8f347knX0PrRQvQL9jj+8SvfapOuBrW1GVoPaHk+7pCPYKay92T7HI3SRzOmPVKug5hdedReEIPs6VSCWhpx8jGp/Hgy3txslJCZegQnn/sFXRduQi97f24aPJxrH76New5OYrK6Elsf+F5vFqeg0W9JZSrJ/Dm2ufw6vZDKKGCozu2Yt3RNszq61TZoq01ya+hNcn9GTqkcedzD5OU/pA9vgyuRrieofFHCK+Ub1LN+ddd85Zi1q5n8cQbBzBUqeDItufw3Tc7sPySSWLtS3Zp/Mf1In9ejP9j9PuyLb0v5HfNfKn+/fyV9Ev1QxH1gCXN5WX1YMnSiXjrqTXYfLSC6shxvPHMGmyduhgLu+S+zen3baJkcHnD6dPYI+mX8GnyL8SjiZ/mWppP1R6nN1R7nDzKdy4vp0cT/xAeKf7auaF5kgxOjoav5XOf+9znKCXSKUfMNQcopU4q+CFMIVwqGS0dmDH7eiw7uQ/P7luHncfewosHXse7oydQRhcmdlyOH7nuT/H7N92Cgbb3v94olao4cvgNrN74PAbm3Ifb5y5GR4uro4SerpmYVQY27F6Lo6Ub8YtX34vq/qdwoOs2fGzJClwzbzl697yB1Xtfx2B1OX7+xs/jp666CJMmLcZtUxZj7/bv47kD76Kr+2P473d9Hh++cACTplyOW6ZcjAPb1+DJg1vRjmvx7678QVw/ezpm9F+KS8rAW7vX4GTLKvz7ZbdicO8RXHHpXVg+0H/mNb3QiTj17YQmyVPmnDb+Egaf1CfUBgxn3WvpwIxZUzC4cS2++K3H8NSrO9B/6fW4/fK56Gwpo7WnH7MnDOG5xx/BNx99Fm8e6MINq27Akhm9qB4/gKeeehLvVadgVn83Jk2fhRObVuNfHngCj655BwPL7sI9V89CV7kEtE3EnCnAc498G996bA3Wbq3izvs+gkv721AuvYeH/t+HcHT+EszsasXAnOnoePdl/OM3H8b3XtyE8oVX48PXLEB3RzsGpkxG+6EtePA7j+Chp17EhmN9WHnLdbh4ag/Knt2ub4N+UPjSJSoW1n4h6eR4U+WYBjfnO/p6FLu2vYKHHlyLV954DU+tXoPHn34Wjz/9LF441IWrLlmMuZOG8dzjj+L+x5/Gmrf244Jrb8GqS6ehs70P8+d0480nH8G3HnkK33thI9oWr8THbpyPnpZ0fvBrKUamNt61/OB02XzLb5Ik/tgcyqvPcSTV0tFdm7CrfTaWzuw5NV5ux8wFs7D/5e/iq996DI8/9w5GLrwRP3jdbLS3tGLyBTPQvut1fP1bD+OR1a9g/fHJ+OC9N2B+XwfKHX2Y01/BC489hK8+9DRe2HQCl628Ecvm9qO1rHwVmMCu4dfG2+W39BjruidRrB/yWntjeu2Z69YJmDuzAy898iC++egzWLN5GCs//CEsn9aJcgCiX0uWPYg2BnnVXuY9ZkJ+zRwfc6p8yNrvHXToGJiDC1q24+tf/zYeWv0q3m1dgI/fdSWmdrYyc86llGuM9tqVmd0Pafp/1r4WWvdS7Pfy2otZZOTRH+q5D/Lvlaq1jMTZyVljcCdTn0MGSXySkdqxWArZp5UBOJvL6ii2b3gIX33t61h9bDeOow3Tulbihy79FFYtvgDdrXp9IR9q8ed5L6u/rLJjFzILv1ZeTN6nkm3VV28MWrLkgwafez9VfPKsMy1Waa7GJ9KYtT9b+ADbIUuqNaIIMYupM2v88sgH7VwgfKjiyonZE1BYUtUPZQtnX+w+KOSHkH2SH6w6LLJT9JG8Y5bX3iELVi2F1j2tnlQ1JY3nsZ/Ic52tx/ofsk9LKfIqyxrgjjdqv2TBnyX/QrYDtnrMYx+kwRrCYM2HUvUUsSA1TsqyaGl4NQHPkvxWTBr7R4eGMIJWdLSXoSUrHm7zoo2Nhcflkxb70JwYHLH5FfJFTGw1Ptfiy8LLYYkhq5yY+FvkavCFMORRGzG25DknNv6xPS2EN8sGSqtTKzem1q2YLH0vy0aF0pdSri+bupbmZO3/1r6v2bDF2KOlGJti6kCyQcMTwpIHT8gmy1jqtT0VZak9aq42V6T4Z/UVYHtLgbunmafFx+msUYp459X3rPIA3RvSNT5LzviyU8VfQ1lqRBpLVe9Z94RZdEsyQ3wxPYOis94ASA08r+Cnonrhy7qJzFueRPWUF0Nj2d7zSZ52kUuBoV7yxmosmvKa8lLKG6vrXlHW0UZTkXtsUeQVpdZSy4upjVgcMVSEXtDElw1H0XtpkXtz3hR9AGA9sUgpO0vAshZSI5IlD51aHzdCdyOoaW962bHjVj4LFdnePGis+DAV5WlvEeM81nIrFd5mHecvs2lv/jobqbvIfS2GimxPnjqzHhqMlT1CKL7j9Rktz3w+528AFLnQ642v6P4oAvk+ynrdpPODin6K28zLJjVpfFCzN+RPzXX//KTmnrxJTRq7VAZOFRVA/yEciarVc///R/eez6u5J/HU8Pk6NZhCOKj7tdOXGF2UP3wZvl6rL7lxXz7Hz82VbKb4QuPuz9CmwP8ZmzcUX8hfPp/kK86vqfFqZGlylMOolUf5zoLXl+Uv4hqfS/L8n6Hc9+/5P93a52yNrSWLDRxOSZbmWsIcGnMxpcp3ba1q7bfgleRzOizYuHsa/1t1hnRJa4Gl7iVbuZrS6g31KimOXJxDNnF4qfmc3ph7mr4aupc6RySSeqYku9ZP3f7qywvpTYmX85MlN30+a4+n7LPYmiK/tOuORmeoVmN6po/Bfwbg5HLztThC90I2aeJAzbfmS5b84rBp+qtWFoVN05tjdGhssdZDiFL0YIlP2x+18nw651cAqtVsJ2ya+T6Pe23RH4s1lf5UVE+dVl0Sfz1wn2/6G5F/Fmo0vkbrz0KN7jNNahJHefa51PPHY98vmn6JGhGPRuNptI0SNWLPLo1J61wjase67o51f+T5fBMzP9ZXqajR/mj086akv6w58ZBOZPwTG+pbc5+fAkPNp+T7ujTYfR7u90ck+6gxbj415tvAzdOeUGk/+zJ9/4Zsok7qKf+H9Es/pXnuNwd+DnDYQvopfZR9vn5/HncaTfkzhMu1SeMX6j6lU7KPwybp494Siu0fIX3+Pe6NEU3+h/LQWneSfsnfNTs0+ae1j7oO1QWlW3NNzQ9RSF5IfxbS5LtVn8Uf1noLyciKP8Y+i77U8kMys+ZfCntCujX9yb2W3sak1ggJb8r+W9Mv4UmRfz6/thdT+LQ6OHwp8iGP9bFGGnst/YaqDUmHH3+XV/ONvca/ljVI2t9r9lfcfDfXqDcYpfmhsSz5EdLhP1+F9FPx52ouFBdfPzcW0m/RR5E2d6y1GMLv37P2xlAv1mAW8VcjvFkrAG6h4sa4B3+qmPwxSnYoqSXsFnsovdTPWL2he5QsF1Pts0ZGKC6+fPe6RpoGq/VxCCMXYwqjpJvDrrGf47PgC8nxx6Qct+KLqY9QPDn5MfpcPVl0anVbMFprlOtdFn3AuXkd0m31e731cf6I6aUWXaH7WeNl1WelFGsMwK/JNcrD53n6JQWWrH3AKkeqrZi9TD31xeRfavs0e0YrZg2vRrY1B7LuXUPztet4TF5zfYTam9dIu0+L3TuE7mXtQ5K/tXtobX5QejTrk+RzDfZYf1h8rhnXxCu0B4zBZ80Trrby3Gf4dmixc+O5/y8AWageOvKmUNMeDzb6lHIzz8kuChUNTyoqgl1ZMaTaAOZB46F/ppafMl71zJ2xTqGHmSy+iJ2bd3xTyYjRY/VvzPw812ANhQ4DxnJtWeKRx8FOSspa69SDrns9FmgsxStEMQcPje4VIcraL4tIRcFYpm5qzgTckxWXX5pL8WtIKz80txH8bpDJExhFcabEUw+q2ZRHgqd+4MjKH2pEeRIlP1W+SKezKeRr+C0n5hRZcqUIzViimFyK2chlkZ8136lvcrS6reMUWXNvvJBva4oHa4ssLtbS/ay5nUKGlkL+pb4xtfBL+4pG5bFkc8r8agS/pfeUSqXMfTLPfQSXS5p9fI0/lI++rJA9FL8Wj0aH/zzhf0ss4dfEIm9+bi5wLn5N7km9IotvNaSRH+qfIX6NznrzW/Y6eeIpUwzaRKASR3pwsASG4/ebjaZZW4pQy+/K93FoFnMrP4fX/2zl11I9D2Fi9MXgs25ErA/FXJFbF0RuvvZASdKd9SFbo0NDXP1Z69v6MOGPaean0KHZaFH8VkwxFGMfYM896b4U16L2k1i/xepLNT+mxqw9xcrvbmRjehZHXO+U7NPozJKrmr2RT9q1JZZHO9+a21ZMFF9sfkk4stih4a/nmmjVTflHekCRcpXaP2sOGEN7YOshihaj5ptvil+rW1PXFH/W54lUzweaPaZGPkeafJHwaXXmUd8cWQ+QYva8PsX2v3KIQatUuufr4JoLV2g+Pk4Wh8XyrWFYKQAAIABJREFUUK9ZjDVBpPhq1zUdtULV2OBfaw9dKHzahw+usC2nV5bNDeUfLV5Nfkk6Lfhixn3/aRdbbj7FG8oVKhauzzn9mtzm8kPqG368pflZehOXE1wtcT6gZHE6KBwU3iwPMxY5ljzncsR6AObP4eZL90P+0+KJ3YhxOCw6NJvXLHngy47ZYId4/X4cmpNiLyHxa+f687V5YHng4PqXdu3LGntrjYV4LD0ri32ankrNid0gSzgsMZDWDw6rdk3054dkcTJi1hiuz4X2p9o85/YYMXtE6zOAT5ZnAmoup0fa88fii1m7tPv1kD81D6ba5wmK/L1+iueJevUNSpdl7xh6PtNQqL9wPaFGZYrRvef/c8coRaHi8Oe4zqEWUl835zROlz9X84DF+YGygZIRKriYxcC9T8mkCpWTHRMrSr+U0JIMzg7ff/5cKp4hfT4+KQdCxNnC4aXInUPhsW6OpXhKteXK5fRTtebbGvIpl5dULkl2hnJVioWfNy6Pj0/rJ85Wn5fKP1+ub4Mvk1pgKVlcbXA9i6rjUE5Q5OcyF0tL3fl1IuGj8Gj0hfJW0yus8dTI4XqDRH5Ox+p3fa61w99w+vGK8QGHjdMvybHmJDVfwkHlJrU2anodx6ftkxJmyg+ULKovSnIpvSFsVO/xx6hxjo+LgS+D8oNGX00HN4ezndujcrkixYZbr2r3pP0wRZQvfBn+2inJcudQeqT9MZcPIQr5TcplrmdSdmn3dpT//PkcPi6nfR1SjEM1zvVpTgf1rBLqX75OiTSHWS6fptdzOPy9BIfT0mO5ZxRKvp+rGtultSukTxOL6D8CSJFvGOVsS3HHYshbh6QbaNrP2T/eybJYjDfiGl29cqHRuUbpbzSmehK3sEqLXErfNNrXjY5/0fp+jbhN13haB6VNJWX/eKfmPuD82QeEcr/e+htN9V73ikbj3b4QjbXaP+sNgNDpoXSiUAs89c2bey3J4+RSJGHQyOdOVTheLQYtNomPk0nFw8epPVGTiItHCG8t/lwRcPi18QmddGmwUvpifMPdk04XNSenoXvUOHdKqNEV8oEWF/VmAPWNhEauNe/ce9r6tcY8xrehRUDjgyy9UfKBtTeG7lEn4VIv1tqg4ZXma2o8q28tpO1hUq+S+gjFq8Ge1V/UWi/VfwhraE7ILs23PCHZoZylcr/W97j8p+Zra8Kfo60daZ0NzY9ZHwD7t9EauVp/pVhnOR+E1gI3/hrs1JilFiUbQrwpcskf83M/tE6H7odqPVTnHMWss1ofUW+0WOzV8HFk6fmSPkl+7PwY21Kue9wcqedb7dXkvkaPhDsmR1m81VMUdVrr83JyNDJjMUj81vupqCZfo59qZCF+y+csMjn+ImBLFfNG545UQyF+N3fGSi5koSLlglS3sT1Ukwt51JsVW5b+nGotSFWfsfzaealywSI7S52kqrFUeIpwP0SpcsG6L5Dmpu4LY3HfYbUr9n5M3qTOhXquyZJMCudYWIclSpELEhbrOg80Nhfy7gVWW6yY86DYdd7Kn9ofZ/0RQP+zy0yRn5T+mNQQqHkuP6eTwqRxiKszVDzUZw359nJ6/GCmSMyaz/xk4ewJxZzDrOXhEpaKiUaOFrO1OCR+Lq9Tki9PqilpvqYJW/2txczxhBYrKT+pe5xMzkZNbK38Li8XK83CR/FyueBjCZFmEdbkl6Wv+tdc3Fw+qTdRcY7t+RxpbaGIi30oFyR+rn9S/Nr1LUtt+59DNePHk6vVUGypawm/pVdz9azJndBamjUXfF5r7oR6ozUXfDyhuVyOcDyxPVyaG1P/tVzV9kSfV7NnTp0LGgr1Aku/c8ctaxYng8MgyQitw74eTT76uKifUm5q137JL37/CMUtlDua/pYlFzQ17FNoX2D1W0z/0tS3tg+4/BY83J5Mu85T465+bRzPPDdUKpWqZsPIjUsPHNK8WNLoS0n10MfpqId9HI6YOeMlHuervhi+eufueNenwREzZ7zn7njUl5XqURPc/fOpNmNovOfueNeXlRq5fozH2hxrzxiN7F3jXV9WGu/+cXWUudMf9x537QPnZFA8sTo5fank+3O4YKSSD+i/veVi4MoKnQD589x7rm5OLmdHbT6FS/JFSL4Vr2+3Nk4cXtcm6kQ5q3wJv6vbt0tjp8RH1Y/ER51Su/drn1Pj4MiPB4dPa2fofk1HyD6tfPdak+9+7lnyiMslf44WG4eVO9FPJZ+SQfnHKt+fI+Gm+oJWHicrFq9GXxb5nDzNGuz3TY18a6249yz5HcpHqs44DCH5XD5L+cPdk3gt/cBSK1r5nE8BuVZi5Uu5RO1DJBs18vPwT6p4+rIk3qy1osltSh9ne6pa9G2y4g3VpsY/lnhS/dHXpZHPXfs+dT9z+6ZU8jl9fi6kkm/FH6pFl1/bSzi5EpZQrYRqUCtfzL2qL80TnOUbfdeBkpyserg5mvkST9b5MbIAiD6R5HL+DPkkFAetHm5OyvgWaX4quanqKcu8PDBLeWfNiRS9ALC9Vu/6jZor8Wvqwr12Kbb+ufvWnmixJeU8wPZqX4xdGll5zklFKe1N7btUvaRR60bseMr9AjUn71rMKw4UjrzWyBovEO6j3F6oNjeW6l1PKftQbM7kkWspYpGKGvmMopGllZmyl8TkCJBvbVnG67F+x+qoV+8uV6v8NyzSJrV2r3bf/+zPp6g27gbEleE3giyfKXzSAkDhp2S5iS3hoHzJ+YyznSLKxy6m0HxKBoWPkhWKT4jPEl8KH2en9l6oUXA5H+Kh+CV5mjpzSYqv5H/OhhBuilez0aUwcHXj8oXyr3Y/5H8fo+9nTXPleoSv3+IbCpffC6UF3P1J9U7/PqU7lGeazTNFLn5LnlH3Y3pfFqJqSepN3MLKydb0YqmuQ/GN6Z1cnVvWD42+0FrCYaTmWnuPjyPEE/rs+869z8n2sUt9m6txDVaOT8PP+ZXqm9J9SQfX/7V7CEm2Brv7mYqF24tD+CQ/avKMywFubeTkaPBZfKbp+9y6wvFyfcAn/0GR8oV1XQn1ZAkfhZdaJznictnab7X+066ZoV6lia/0TONeu3sJy5op4bDmdigOkjyrv/0eGZOv2j17TZemd5PjVUtnGIckOa8R+qx46o2/SU06X8lau1lrM3WvsOrLqj+1v0L8qXtn3vLyzo8mxdNYy6Ws8prUpHpRMxeb1KRi0Hl/ANCkJjWpSU1qUpOa1KQmNalJTWrS+UDlLJOl15sk/lRnDo0+u0itv1H25KW30fFpkp5iazmrjizyikxNe5o0VihFbGNfN9bIbHTujZf9So2KgqNJ51LR9pR546l3LjY694sS30b7oUlnU6PicdYBQAiE9fdCOJnU7475vzuioZAuqz0xc2J/dySGsj50cfO1f2/ASnn/jq51PG/9RZcvkaaWLUTVsiQv5vdcLf7KUtcxOjS/pzyWFuF6v7JZtFqrR/7kSVns1fzeovV1dA0e7u9hhHoBFYssa0eW38Gn5Gj4qd/z1FKIl/ubJqnkU/x51kM99ln1qufUfZb7exUp8WSRp/kd+pS9NY912dJb8oovpy+056d4LNdFW+coyhN/KvtDv+7lfk75zJnrrwBUq83f9ZGo5vp6+SgUj6LFq97+CVER/VMUPDUsRcGUKndS2ZXHJiALpjxqKyueIuRNjYqIByhGL0ydy1lrrKh4ihAr4Fw8KXpZil5YVP80moqGB0jXD4vYV4uEp0kyNeOVls68AWA5VdCeqIROp6hrfywVLkp2veZyJziav4hpOb2yngb541lOBS28Wlkx/vHHUuZPXqemsdcx9ZXSX9R87bdcedeq5q85W3Bk9XUNj4spla+psdC19i/yWnCF/uJtyD959jaLLN+3RViD/Hj5+ZNFdsr6isHhftMfg4vLZSuOGvlvHsT6RxqPwRWaH/KPv++I7T/Wb22z+IeSbbnW8Pr+0czPc/2vYbLwp8AlydKsfxo92p5RT19bZMfiCOGqJw5/rAjrm39tzZ+U61ue/pIoT19zVK4xSwtEaHF1XzOSXvFx9WgA+gs7JTs0Xzumke36g9owUP7ifOJ+9v3D6fLj5GPj9HC+lh4gJD2UjZLcUNH6Nko4JJsoGb4sDS53nCr2UEwpm7iYa2zi+CVZ1LUlf7hcdMf9MekbJoqfw+lTaHMWenCw6JVyJNQXQ3Xvx8lSyxYKxVzyp7WXUXGN9Y/U632d2sMPiqRa1cry7Q3ZTOWntgYoHNSBgPvZ0hdie4bLr+mh2nVFk3tUPVLyqH0JdW0ha21q/UPJlvYh7rh1zfavs9Q5l5+SDT6vHy9Kt8/L2RS7/rvXkk2a/iz5M2YfK+0XrHvRLLI064hUX9o9nyU3ub1WbO/S7i0t/qFs5OSG+lUIoy835AOXpH7jytL4jFobqThJOKx7CY6fwkXJCs31x7PI8n0W29somdo9TZkKpBs06ieVvP6GNiQnlGgUWF8mZ1SIKIwcbl++xqnahuNvTtyC4QqtxufLkhZkv1g4P1L8rjyqMXEyuDHXNq5R+z7wk5njd/FzhUDhkhq1+5OKky9Xin0ovymisEm6qJqjZPq8oQ2LVL9cHfnypDhwvuT4NHHybZFyP6TDJTf+VO/wMVA4/HvufG7RsPS+UC5S+EJ5xenj6inEG+ofPo/U6/yx0CIuYaP6a22ckk/Vk+9PadNAYaL6mTb2FEaupiiZvm6OKPukPKLslnov54OQPzX9VdN7fVkcPr+utbql+T6/lA+uP/y1j5Ih9V7unpT3vkzp4YbSQeWbtj44mzgeidfFL+1Ppc8afmpMExNujMt/Db9fT9Lej7ovrXOuPo4v1NtDdc31Mm3u+Top+/y+L/VP6uCD8xU1j/Kfjyu0Tki6uN5M8dXkUD7gHnQp+RSW0F5Ig01Tj5ral/Rwtcn1LK6vSL0ohJ/qrRSvdI/jMf8NAEugspKvi9Lt3qsntrFCRfNPIzGE8qkI/vGpSJg0C1meuoseuyLltnX8fKdG5jZHRerdRau3Ivmm0TQWeqNPRcNUtHwqAgaXioanRn7fLirOetFY6AVF2ied7/7J9N8AxpDlvIE6ZZJO3DROM553jPn5mm+e8tSfmrLo9+3nTjHz0h8zX3Pil6d+CUs99fsnxjGxy6JfM7+R+RPSHfqWMav+sT6f+9avXvop4t4yqJd+CkvWg5JU+K3rfmr9RZof6oXUt5Ip9cfMb3T++KTNp3r5T/oGtx76fWp0/+Hm+307lFdFw596fuy+qF6U9eE29fOH1V/1iH89+4/qAMCilHuVoUYxjc1/aAvpcMe0vFo80utCWUnjg6wFLT1QauzKuhCEHmhDeLIujFb/+Xi0mynOriz6tTokssTPyhPij42fdGhj8YEUv5AcbfxCcnz9HAZKjv8tVYhqPNra0ODh9OcVP67+LPNcouJnWU/qUf+WQybrWqjJH8mXlvwPrR/W3Lfqp8a0myvucyh/UpHvH0q/tb45PRZebf/R+i+2/jUYNPolXupa0q9df7PsSyWy7N+s87hxax/R9G/JP/58iy9j88el0JdoITxZH+4o/1nwWMjaG7TzsuS+dv8Y27+z1L8Gj+b5MeQfTm9M/pTdC8umiVLsF5hlsy/pkBad0DzX4f61j52T6/OETo2ybKAkWzji9FHFb2lI2jHtRkQTPyl/NHmgKWZL05EafmjM1VvPb6k0pGlkFOYsJ6bW+HFjVL/RNFHpjaLQt2aahT8kx8clfesc8r0mn2o83DyqF3C82m8ZLZs+ap62H4T0h+Llz+X0a+e5uq36KbkasvQVKbZaHZp1JibXfB1UbLX1R1372DSbQyonYtYBildjg6avxhymSutSaN9gyR+KN7b+uTjE+lJ6KJL0h/ZOoX0gx+eTtE+J7Q2p9hRc3XK8rm6pN1j3fe7aFsrLmPyRSHqIo/Ck7g0WXmmPIZHUG0K8oZzQ9AZLr6d0SngoX3L7BsseXxpLlRPSWqjNCReP+DcAqAIPLTw1cJqksz4YaSi0mciKQZJv9VcKasqXZY11/ClpLPm63r5I3bNi5WspS99Kxd/MV7vOospP6Z+x4Ou8+eslKw/5eeNrtH5rb8t7n5oHpVzPstRzyh6i4UvhV80zTgzWPPA0UlZTfmPXkVj56gOAJjWpSU1qUpOa1KQmNalJTWpSk5o0PuisvwFQezUq5kyAezVEM497/UM7n7vHzfdfh9C+fsL5xvL6SgiPdJ3FT5TOkFzuOiRXc1/rS4tOS+5qcVpxaHOP4outPUk+J1fCEcKTpWZT5Jpvm4vJqt+X4d7TxDJmjoay6g/xhnRTPzk+SQ4nSxMH6WeKWglhlfBl7TMamSl6lKbvcv6MiR133xJ3CStH1tzR6Lfq1aypKeqTkkthkfSGeoXmvmZ9oPBpbKHkxeS9ZX3hsGpimTe2kLws+iUcoVha9Vr6XBZdWt0WuVnmuhhCMrL0d61MTYxj9Gr5rbHg8Gr0SPdj9Id4fZ7Y3h5Lmt5Vo4a8AVCt6l6x8fmkeZIuIP73fUIY60Gx+rh5eePXxi02Ntr8iRlPrc9KecQmFX5LXGPyrt51FUOpbSuKzY3An9V2y/pQlHVgLPTyeq/BWf1IYZT0aWT692PkWXRJ9kjYtDz1XMNCFJPLtbFY31jxAfnlayqq5zprkZlnPqXun1lkSjKy7KuocQBiv0vZr7NiLUJt1JvquS9M6S/yACBrkUnNOpUuC5566NLoSIUna3OxxKcelHVxz6vJxerOy6/jrVbGMp5GUxOPTE08xaHz2XaKGu2PovVWn4qG53wizX6m0fGJwZPn4Vhq/2R9hshTfwzveMOTmurpH5/O/ApA7RyAOA8I3qNOTN2HKGmue3LF6atW5VfaOB01/dQJGsXv/uMwh/T7Ojj9vn809rh2UWPUPSkGsfq18dH603/Y1vqTk5fVHl83Z2ONxx/zfa6tH0qXht+3R9JF8YcWHKsurT2SHF8X9Q0fN8+Sn5w8yT9SDobyk7qOqTfpc8geSZcGH4VJG58s+WGxR8rnFPmp7Yc14nqtZI+2p2n0c3Ji7bH0Y6qHp9CfUh41N8Sv7SkxPVni9/uM1X5/jhSfWBu1+LT3UuVHFnss2GP0S/ZQc7X3NPlUI38/U7vHyZHkpfKnZIeLmdPF4dXYQ/Vtyj9ZatAf4+yp9VL3nv9MEbKH0huyR8oxzbofkmft0f4Y5R9qDmdD1v6VNd8pzFn7p1bemQMAF4SfgKHTBerBlgPpy/fv+UH09VNYqKbl6vfnUAlZ4ymVSmQBxn5T73+m7JF84c7R+DakvyY/i35uji+vxkth8HWFYuziCOmndLj6pdyWmog/N8Tj20jpD811ZVA+puygGjpHlP1+PVBzrLkoxUWqNyk/KZmS//yf1L1Qvbs5SOngDqy4Hunqp/By9vnYKZ9R9oR6n69f01NDtajJRapHczmoyQ8KlyTLot/XK82l5oRqgbvH5YxWP8cfI4+qI6s9fl5oYqHBG8JHrSFSjlIyqLqxxIciTU5T+vz1JYRds4Zy60CoLt2fkr1S/6jdC+n35Un6Y+xxsVj6NdcXfL2SPb5+rueFelSINDkT6vlST9OsFxQmqUdQ+l0eXxa1P6J4Lfp9eaF+z+kPPSP4eWfRb7VH2he7PJw/89bvzqfkcbxF8ae035fsCdnKrRtcXZyFs6rZvY8jCgW30fLOZ2r6Mj2l9KnmwdgyN4s8DfmN2oovi7wsWGPxZeGvt7wUlNUnRbSpEZQ6txrh11id3Dx305bCltTyxhKl7r1Z9eUhz0JFl+fLBvSHI2NdXmhOEeQ1KV86n2JSDrOcS/6ZQZYzhJRzuRNglzQLg4VCC1tqapSv6yGTOyXLQkU636qdnqaUF6KYxYqTLckK6Yn9hoIjq+0x+LLIs1JWfL4/UhyepJSXB1kx+fxFtImjPPtYjB9TrrEpbIuNpfTwn0Uupyf2kEK6jqE81yFr77D23hRkkZd6X9JIWyiS4meNXWgP7n8bHpKnwaeR5+IKxTJ2z8RdZ5VnpaI8n2llWnQU/Rkmj96cxzNyjc75GwAaxdqNFDefejWDmiM1E+mUxi16jV1cw9MEIvU9f5xqJrHyrXND9odkheJH3bO8WqShkDzrPco+7dzQYmXFJr0aFJNvrsys2GJib7kXsj22dmOJ0lePfuH7g+Oj5mn6YMrcykL19GXoXhF0WnFY+pamdkPrpHTPzy1fVqNrN8sam8c960OR5l7KdTa0H6y330KvzFrlh/axKeTltefg5LhjmlzQ2uAfdKXew/nX1t7g7sFS5ZYFn6bXuPdiYq95yy1LT7X4jbLfEj/fD9bYa/I5S/w4WVL8QjH1ZVvWoxD5ssrcRtVXIjURid8fcw2Skp9K3KyLHLcp8QuOCzpVmJp7ri1ZCpvCrk0wSyJyvue+xdXmBqWHssG9FypgS9PSNH5LLGLkWeLP1Yc/x60Zdy5HmlzgFg0pxzk5XC1I96jDEldeisWKavSULSF/+bbUyMXK9R4Jp39fOtgM9QLKPm6jwPG4fBJ2qoa5exI/5wvJV5q+JdUHF0MNLzeP8yUnT6pxX5fWT9q6CeVhaHMayiMun917ljVFa7/kO80mXGOXVIPSXiTUy0Mx4X5yeEM+k3qGdlzqj5re5eOl8sYlbg0M1Qm1L5MOqDjieiqFTVrXKWwuHslOrl+4+23f1tpPLi6STe49Ksd9HJo89rFQ9zhZ1ntZH7TrMZeaJ8VK6y+qb2kfXqW5Lj9XW5o+wGH364jSSfUKX4b0bCnVlrQHo8ivQ+qetna1Nlhy8Jy/AUAJtoxrKIWMFHo0OPL2Rz38nQpL1vmacUBecOuho15UhNwC8vE3tQDkHde8bdWQb3deeZa3vzT6gewxlWTUK2YayrsWG4nBmrP1WFdDVI/cKgrVI8ezxqweMdfKqUetjgUMKfQ0Yt2MkT+WcgvIf80rij9DNF6eN+v5nJaFfJzmA4BY3hhKLX+s4aXkA/ltWsa6f84HyrM+x9NhVGr5jc7dZm9pUt6kjVHem+2i1f75Jj81Nf0h01jGP1Ye0OqlK+/np7GcK3nQWH64L0Isxf8FoJGn5I1wzvlmbyP1Noqy2DsWfdXIvALOn1o63+xtpN5G0fnWO4BmLTX1Fk/vWKyl881eoHG9o1G+Gou1NBbpfKulPO0V/whgqXTu/18pnBeoeTh9vm6fh5qTQleNx7eX4snLfu6bEOmau2fhcV/91FC94q+dY9UVevUqBkMeclLxUHWkkcP5Wmt/qJY0eGLt9/XWw/4U9mp1+Xya1/li9FM8mlqKobx7ewqeLBQTo5S2xfYtf/1PQSE8tVrKK7aSr+v12mvM+s/JCvFK9lvX/xjS+F8zr0bWnEy1j4olv0db17YUe1Ktrqzk4tH8akFWTEXq/7WeVW/coXpoVPyz6oup/5D9Wff/IcrD/ix1FFpHg28AWF8J5D5bZFj1W2Ra5wPhv6o5OjqKkdHRaD1NalKTmtSkJjWpSU1qUpOa1KQwlUoltLW2Rj87cg/ZtfnaL1iyPLtan1OpQ5/Y51zxACArWYGmNKyeVKlUUa1WGg2jSU1qUpOa1KQmNalJTWpSk8Y5ldDSUg6zjWPK8tzc6k4Czv0vRzhFFL977X+mQIf0afg5TBw+d9w6n+Mvl0uoVssqe1LoS8FP4WkkPkl3kfxHXfv3Q/r8zxZ+ygfc/CL5yTKfysdQnlp8k6fd1nyvd1y4/tRof4T4/byqBz7fT2Mpnzjs2n5jzSFtT+Js4nDE4tPWWt6fQ/5oND6ud7vUKD+Nhf5Ub3w+Fc0f3M9646PmFzGf8tAX4vE/u5R3bcfMDeEL4Y6NF+UzSq7VPk5f6nyn5vu+LFUqlSplEDXJT1qKJIAcr5VPMkzCrNURSlqpEWt4/Xla/izx0PjaGg8fvxWzNI/DT8nU6LP4l2sGFD8lm4sLxa+NR0w+UbL8z5yMUE+w5Io7HotD0uHqccnCb7FFq6M2R7OwSH528cX0SMoGS01pMWv0SPb6/JbcsuRKCL/UQyg+62aA0xVTGxpe3wZNP9HkkSaGIXzW/u5j4/BxOnwK1Qh1zWGR4hjaV3DzOD2WetX2T8peS65Y427R4dsT2otx9lp6rSuDu7bYbV3Hrfnk209hkzC5cyRcLo9mfaL8GtJD4dPsrzSxsK7Fku2WmGtstvY2CYc17iF9ki3SeuDyWtZdDb9GtrSea3ujS5b6CNkirQsafSGdEoZqtcr/CoB1E+QboC1Aa9A141rSNNF6YK+HvZpiySNWHJbU8dOO5xU/QFeAWagR9sbgSDUnhiwLRl56UoynwlFkamTvD1EeOBoZK2nTm0pmXnLq2cdT98o8dOexH7DitYxTPM34FWcfFZIZg70o6591PDY2edqbMrc09qWwt8j25JGvoX1nUeNn+hsAY2WzqcWZ1Z56N+2ibI7rRU176kdZc7kRByPapquVUa8NZFGoSA+kWfk0vHnam8oey4NeEeyxyKl95mTXa93OKle74dLG8nzoNY2kouZbLI21fWvelKc/imy3hmIeDscSpT4YbTTV24ay//wvXafaEFiuY2RpcXIPLCmwaXSm1qc59UmpL0RZ9aW2J6t9WfXFLLqW6yxU25hb9Ln2ULaVSuf+N6IW+RJRCxuHTaKQDZy+rFSE3LXEJoW+GIp9+A/ZayWrPdx4CAOXj9b4WSnWnhBR9nC9Jtae1LmWR+5aci/v2BZ9nUytj6Oi7hNT9RqOYuxp5NoXkuX2kxjfW2qt0bVipax7aCvVu/ZditnDWqne8cpbX9lXaDktimlMfpBCr2pIFMIe0xilOSF9PmXBH6MvpJOS58dCkmvVabVPkkWN+Rs2jXyNXI5i7Gm0PksNcBtgjQ5NbmTpNT7VctWSkzG+8PVx5I5xnyV52gdDzi7NYY221iWKnROqVa3smF6TYgOrqUVNPP3c0OZv1l4X2iD7m+jvVlaOAAAgAElEQVTUaw+Xj7V/2nrj9hTStRajVl7WPh9aY629ISTXH9MeLGn3Av7nFPsYSi43Fqp16+FLiLLsWSl9XK1L11J+ZN33Wntn1gOILPXrHipa5mrWkZheEaJQrC3yY/qwz6fpu6G1Q7vH01xLsqV7sfI1FGNfqr1VlvzQkPg3ACQlXGOwbLZiN2YpNnQa2XnqqckH5M0w1ZBivk2w2hJjez381ah4SHPy9qtmLjWWt7/qSVw9hB60tLVcj9jHzomZmyL21nxLrb8eFGtH6tg30l8xPQyQDzksvYh6iMq7rlwbxsO6ldcejZqjfSiM3UflHf+YXl9PKlo+Zqn3vHPFOiem3+e97lox5V2Lln7cCH/Vk4rYi1L2U9PfAMiDsibAeNmINil/ypor1o1q1ofO0ENsio1zk8YujeV4j2Xs5wuFHiDzHpeuAfmtCH/TK/Fb+2ozd4tB52McQrXQpLFNqfeo9aY8vmgZa1S0AzyJyr5g9yc1xgEKyeFkS99+a3RRzZAajznnqFbpV2tDsii7ufHQ/dA9CY8GqxabVmbW86SQ76wytLzuppTj8XM1xB8iLvddfdTpKjU/dErLYZNyPDYfJeLmW/RpdMf0srxsS8UfI9PqB26+FodGX8wCJuVHln6Uuhdrx2IxWMatczRjbuzYbxWccW5NtuQA1edc2f61P4fq265NmnFfdmjd5e7F5ETsOh6qZeu+IYQ3Sy+OsS+094vZB8Ris64zsWsdlZv1yEcNzhCGGPnS3iAGIzWmqTVL7mvnUTyhnsj1VM18Lp9TrPFcL9Xiy7qGx+akhqy9mNqzx/YiyteaNzi4e/5Y2S2wUHJxwmv3fTmUPKpp+w7yeaTFTBvgUOJx8l0bqM0HNY/bfGgKL+QLn9wFwfcV52sKA2cvh4mTp42dP6aJr38vlOjc4ubH04+ZzyuNUXZRxGH24xeKmV9T/jypWfk1KeU4hcGdz+WZb2sox10Zvg0+Ft8+STf3EML5gOpXXA+jfCz1Ty7HKX+E5lI+8fFKMkO+5R52uPmcDqlvSRgpX0n+p3JGmsPFV5OnofVMg5fSQ9mg6W1cHlM6NTnK9QG/T3J9T+q3Uk+Q6kMa09YbV1vSfM5+91rq1VyspD0W1VO5OqV6qF8XFGaqtqm4cGu8pRY58vORmkvh0tS4pR+719S+RdrLaGqR0sn1Rj/fOB/UiOqh3N7A/8zx+jZw9nA9M7QXDeUHh12zh9bEnvOTb4/2IVXTe6j9EhcTXw7XKzVrHqUz5EdKnpQT/iGsRJw9FB+Fj8NcI84nlNwQBgkP1Vel/uT7R9PD3LnUuiHVpi+nRpycUqVSqUqLjZX8BI2RFyuD4qUCECuPkx86dauXfzV464kvdq61uVgwZc0nf9yCryj15coC4muDmpui5jX3Y+Vx46HabnTsQrVR7147VuU1kqjNW9b6zSv+sX0ytQyOJ3S/yHnY6NrV+FGSF7PPsFC990lWGUXfx8XoztKPGumbImDi+CTevPakVipab0wlr161G8tblPiLfwMgxUJnfWBOpYcaszaTRhfbWPF/PWSPRcrD/5bFJ5XcesgrWq7XuzdkxdNoGu/+KLq+ovYVi7zYQ8QixKbo9WmhIvgzJX8RqUhrtaRjvOZCkewbS/kcgzXl2lK0fWJoftHzq+F/BLBJTWpSk5rUpCY1qUlNalKTmtSkJuVP5B8B1JLEn/JcIRWuatX++x8pfWKlvOMRi7VR8QjpttqYd2wbqbuoslL5JJQ74zkXYvVY+M/nXpmSiuoTqT78sdS5kHIt0sqP5S8irvO5Nosqy0rjZe2y0niRlbI2rVREu7mxRj9jpNY93mrzrAMA66sK2tfu3fsxFHoVVyJ/3GJjqXTuX2HXzOFsttqv+b0vip/SScnK+rs1GlxcLtT0Z8k5jf0cLl+WVbdErs+5+KfQrbGT4kn1SpIUWw6LxG+tTU6POz4ec4GSwcmKzQVNbWp8KPXCFL+LZ+FJ/dCfZbHm5lpfh5TkWXOuds8fC+UCtemVcoHCFbsWcfolfv+zRNY618rPkgtUPCR5NX6L/TGv+Ur6JR5LL5b2nNRnbr+gWbu0uiX9HI9037pX82Mbohj+EFljm2KPTMXW7wUp9iUh3Vo91H2tHEm3db6kP1a31Yep+w8n2xqXkG6uNlPtM2LjEV1DVQV3is2aRm7oOkZm3mTR17Qvrb4UVG/7zhca774ai/Y1azmON08ZeelLiS0mF4rsm/OdxoKvsmAcb73qfKPmnux9ato3vqho9gYPAIoGuElNGquUtXZSzw/JyzrepCbVqNG5XzRKva7mPX+8+b9JTSoqFb0XNKlJTaoP5V3LZXbkNFGvA1qUU/eo1xVq96lXeaSfvo7QtQU7h4HCLN2TcHA+0trA+cbHytnE+V8zn+KJoZBO7icVHw5TqryQSPKXxo9WvFabQrWsyQv3s/vqU2weaHKbG9PmNocvlEvWGpZqUbKN6x1cf4nVpeG1kFSTmjiEatsl6fVCKa7cHB+PNvdD8jhMPsV8o67pERJWzraafglz1k2IhF1Tq9zcVKTpDZqe48vi8kuT81J8Q/ipcQsOqfdQOrU1GIqtzxPqiZI9mmut/zi7NeMh3/hk/XUbrldqKOSHUG1q/BrCm5KkuGvy2lJfFrs0/S82t6V7HBZtDKT+psFh6SeUbg1+bb2F5mr8Z+lzIfmxxPmPuuZ+BapG57wB4E8KARlrJ4VWzHnaWHN904fxOID8/Nfo/I7VX5QazjM+MbLz9otmzlitnbxxF6UXZvU3Nz/G31b+LPGR5hclZ61krXfA9vvOecYmT/lFoDx7cRF7W6Pjk1ctxMi3kAZLFt1FiE0MDi1/EXK7KD4uIjXaN+UaiBr5mwLqlIfidfk50p5cSCTp0MgJnYhI/FYKyS+V7H8Ez6pDy5NKF0XSt3dZcEj+s/pFk98xchtBFn/n2Xz8+MT4hZsTUzt52qpt5Fkwp84rC5Z6+Drr22UpKKu/pdqz+rue8ZHsTh17q19j+fPK2dSxofwdeuCxyLdS3vGxUkwcLXUcEx8rnpSU2t+h/AvtkyR5MbnkP4/k6T/LgR83liIeVn9L/Bb7YnLb6j8rSfan8jenz8pvxZPV3zE6JCL/G8CaUS44KuH8n9LDWE2e+7M25l9TCUAlHaefO2Cg+Cl9kn7LT9cuDR5ff6oDE9+/GiyS36mDH43MlP7W6Arhc/OF8xHVUDk+TpYUU+qnVE8WWb6/Q7g527U6uWZoyTlfl5S7WvzcOKW7Rq7vNHgpnBZ/c/6T+gmHzdKbNPwcWfNakqnxn9Xfkj81+K06JP9qZXGkyQ+rfZra0PYAjbwaSb7w7fL5U9kewun72oKX44+ZE2MfRVxsKd15+Nsfl/Z8IV3SOCWT2i9a8iNkn4SLmm+xL9YHFn9z9UhhCGHyidqTS7ZL/BRR+RrKJ4rf59XG1mqfpNOVqe0VLobaZ25/ztWGRVfNf/641d9crvoy/LnSl3Jaf2vzn5vv8rv+1tS+Vpdkc6gXSTH175cqlUqVehDiHo64cW4+Rdx8ajw0P0Qx8i14LX7R6I7lzWqLRhZlO9dsJJ/H2CXlphZzSEY9/Z0naeLEzQPifj85Zd6H5Gqx1JNi4xyLN6u/pPHUPsySj6ljntK2lL0jK668+0zedZUFfyP6ch7+zrPupBrUruuNzPWU/o7tK6l6apY1NUZe3v7Kq3fF9vVQ3ELPKans0eyFNfgtuFLs17Lmp9XfIfxZaoGLgWa+BbeV/OdGF6PFRmque83pro2T/wtAnpvtRm3QOcqyeQwFKjWGovmuCFS0h8SixahRPsn6wJ+3fs2cLHjy3gTXQ18WPEUjbb6lqpe88zuWioAhRDG+s8xJ8cBb736Zp+x652qq+DYSj1VeKtmp8BQBQxFlN7o/ptoXpLJDIzvl4VwMnvFOedqc6Y8AUnQ+BSjlA0OM3lh9KZsDYP89oJQnrI20v17USLxjzVdNOkWNjtv5rr/RlPpgu57UiIcTIPvf+8nrgTFvGk8Pg/XSP5b3yVbdWR/wUvqq3vo1386m1p+1H6ec3+h413t+EdaCeuon3wDIm7JsTsYjnQ82Wuh8yI+8bCzKCay1kTXj2CSJiuS7sVi7eeIoUmwsNBbjmCc1/RFPRandJp1L50OuNm2sD+94o3P+FwD3ulrV/xEgbr7E5/K7Yy5/7ZteTh6FlZMrYc16neVnyEbKZsqX3H2OrLb69zgsWfOJmsf99E86/fmSbCrnLOMWrFY57jVlI1UDWXRorrlc5fh8fFIua+Vy80O+yNqrYsa1tlts0+Qzx8NRlvqTsIRsk3CE5lM2h2RqfMBhccnNVU5PrC9dfk38NfmhzSkKh1aHJJ/j0eZrTI2GdAPh/+WF4uXGXdl+L9PYGpMflG3ctYSdI4mfq4GQTkpHKB9DuW21PfY6pNedV886t9a0xjarTVq9kg81tmvtcX+G9ogUaXuSZIskTxNX6acvl3uApfxN9bKYa1+u1ubY8dTE9SMJS+1zqv6S0jccLgnLWW8AuMmRkixyrRgofk6GhTcFvhCvRlYKfXn5X6OP+xyjz4o3D31WLCH7U+tLJUPrO2vO5VmbFNVbnwVHvfXlKSNFHQP1fWOkketSLP565HPsulSU+mlE76n3PkSLIZXsrDjy3GeloHr3unr7ot65odUXutbKztO+eu/BLZSqB9YLR0y8U+DIi8a6vrP+G0DuZEgCo+FJ2Vh9naEHbC2vhqzOD/GmePg/6zSH4a336y0WHNLpLEVZY0otHHmSq8+KNYSN+hbGMp/CJM0JxY+6759UZq0fa7wkfFl6iZUnZkNssbXovS61jHr3NA2FerG1F1DxL4qPLPWTosdS64R1vcviO00vtuirZ71a14ms8bL6QiujRqnX7FT7LKtOLcX2iljZlrWO43XXf8l3/j4hdk3U1nyMn1L0XOs+V8vL1XaKw3gLaeuVi7+FrHtU7dwYismv1Pu6TPKqeT8BNalJTWpSk5rUpCY1qUlNalKTmtSkhlM5zPI+xZ4VpDxj8E8UiySvKNi4OXngS0lFkSf5LyUVWV5WWefruWLK032rPI2slPia/SSbrKLWSA1bvfBZ9RQ5rnnpK3qdpZBZ5LgWeZ9Yk5lqXt62ZpFdlD12k+KpXvvrJoXJdAAQ+1pJitfbXFnW1y6yvDISmu82EAqbZn5qbNzrRql9FxoPNdfQ62HW+TH4KEr1OlneD9Gh14PyxBfzSqxl/lhdDFL/ikMje10IXx79JMvcRteDtdf5fTplL7WMc9i413g5GbHYQvP98ZjXIIvUT2JeG0356xypfzWE2/fEyHEpa8xSrkEpe11NVuy+kBqPxRb76xpZ9sQa27P6zmK/1IdDhxfUdda45j0/i/wQafDF/qqSVn6T9FR2E4JKfGpc4pPmxcrlfp+4Rm7iUPJd4mRQ+mv/Uuv3GyTnE8m3rm4OWw07Z5dWP+c76qCB8w1li9/MORsl/f4mVYqNLyPkO24x8H3n/6NwUzGk9PvjIf1av4X0a+pF4yetDzkd3BiHxYKN0xVzj7Pbop+aq61nya+WnKT0S/7U1KuUExJeCVtojPINV6+p9PvjnO9q2CT9nH/8Wuf4Kfu0+v25WbBLvnFxWfRL93zdGhlSTXBzpbzj5HJzrfqlegr1n5B+TQ2H9GuxcXhj52bVH+q10j2q3/j8/jyLft83Wj4fG+cvCp+UwxqfuHbJe+JwLnL6Q7Xj65fsCc2V+LgxgO91kl/duHG6/LjG6peeCbLUBIUphf1+fEL2c/pj7aLymJsbUy8W/Vy9xMptdQdqznU3G9RnN0j+uJ+IftBcGX7QJP1cgCkdIf2SrVQh+brOvTeMw/sO4MDxITiz0d7Zi6mT+9DecrYutzlxtpZKJWB0CJteeBhfe/YEbvjQKqxYMBUtSlvdRubbytlJ+cLqO18/p48qat9+jT0+Dnc+dd8nq35/Hucryq8SVim/fHncfMpWKXaSXzW2aWKg8auPl7PTJSqnQ37lcFDEyXPHOB2Uzyn5VD76vpDsyWKr1Fcp7KG6k/zg+4/yoYtFGuN0hfRT9kl+lXqnZI//2aWsvY6SV9PH5VhIv2Sr1ncaW/3Yujwa/ZQMa01wtobspfzE6dBgq11r16lQ3VHYKD9IvqRs5eRoa4Kaz+nS9DNJv6bnUv3g5MH3sOvwIM4daUHvpEkY6OtCmakX7pqyj/OBpq9y8vz5Pp4sNcH5s1o9iV3b9uLkOaDa0T95EiZ2t5O6RoeOY+/+AzhR6cGcmRNw4sB72LHrEDpmzMf8/nYWN7U2WHJRk0OUP7nYUTVO+0m/XrrXvt6wrioGTxzGe+8dwbAfk5ZuzJwxCZ0tZdUaUvscs05RPO5cSb8fY2tf5/zK1Rp1L1QTLoXWDq63crXK+S7Uu0OksbXVFapZtDjjuYSWHOk6Swqyb4xvGFdEGn1UcO04DuHpf/0avvniZgxVS6iWAJRa0D/jInzwg7dj5RVz0EMcAvhyzvFrtYKjezbh9beOY/7N16ACoOUci+jipXxD/aQo1CykeHKyNfq5puKPuTZTTUCyRcpHaUEIxU5aHKRmwS0+mphy9WVpoJQdHBbO9zV+yR5KByePyzNftsSjWWykuHKLBecP6r7vT5+HsscnqW408ZHqgvMN50Opzig8vt3SHGojQPG519zaQdlDbUoo/0jrjKuDyw0KB4XH18H1Dy4vfL9KfubkcDXArZFaX0m2cn3D16epJf+zyyPZ42OU7OFqneqxkp85fK4szmaNLk6e5BefKBlU3+LixPkz1DOo3u/7jvORVFMhHdVqFVuf/Ab+6OENGBo9PacEAFUAE3HzJz6OT922FL2EXC6vqBhKvtLYw/Uu30c+vytHk+/cvLN/bsfff/5v8HYVqJZOuasKAF0X4JOfvg/3LJuJNiLeJ3e9hX/68j/j5RPX4n//ndux49Wn8Q9fXYOZP/gr+E+3zGDxS7ZS9Ub5l7LHl0fFIzYX/c/cuin1Wt9OTl61OoqdG5/BF/7qUew8CyyAScvxW7/2CSzu6yB9SPVOad2k+jLXk6Q+SPWKkH7fp1y8KKyuTgk7J9v3GZWbvi7XZs53FFnwcD2T8hXXs1tDTVpaRCRe1wHcuMYhLmj/c8hZ1PwYCifMqZ/l1nZceeu9WD4VqAztw/cffhb/9u3H0NN/H1bO76VEn6OHbNQMD1ccWpIak4SH4uUwxCQ8J0vCyenSLHLumDRXi0cz12KvVG+aHAgtUAD/sB665nyfot78a26jKenjfKOtG0tMtfe1vnUpNj4cDmt8rPWZ0j9WHYB8sFu71vZPn0eTE1b/atYxCaslHyR7atdS35bGtHmnWZ+1OvyNl/QQbbWHm8/Zk2Uds+iKXTO1pMGh1at5YJfs0awtmrWfmjv9ilX44cnLcPLQLqxZuxbrq4vxmdsuRltLB2bMn4VOYo60DgHAkXdfxQNPbMKUpcuwYuk89LTKsbP2Uss64OLleEL2uJhrbbV31gLceO0yzOo5zdTSi/lzJ6EFdLzbBy7AbXd/DFeOTjlzoAJCXU2Xj5XLBd+eUK1TMik5IZ3cnJA9MTKk+LlTp1y6AndeNhMdtW8J26dgWmcrKIpZY6Uebclniz8tPU3TFy1ruPaeZV9qySNujQzVf6iXutetvnBuEgcmS3GEeCSDNaei2gWfu+acyNpbbsG8y6/HLQuAamUQU/atx5+s3o2NW/bimnmdOPTGk/jit1/DgeEquvvn4o5778ZVM7uAahUnd7+Orz34NNbvGURX/3zcfs8tWD6z4yz5wyf24bv/+I9YO3gBPnTvB3DVrA68tfo7eGDtdhwdAabMXYqP3PsBzO8BgFFsWfsdfOmJDShPWYSVF4xg9Vt7cMntP4SPXNyL0YOb8c//+l28tuskOiddgNvuvhVXz5uEVkMBZolvaPMdE7+sOZlyAxVahDT2aXJbWvA0i6HLayHtpkIzN2RPaIOSB4Uad4r+opHF6beSJRc0mKQ1IHa9SElZNiH+eB7xtOK1Up72paYY2dL64ee61Z68H65DevOs1RB/1i8VKNKs71J/DfXeLPk6cd4S3DwPOLHzDWx580Wsr87BTTdch862MlCtonp8J775tfvx0s7jKPdOx81334mbF/ajPHIcG198Bvd/fx32D5Ux6+Kr8KFbr8bsQ2vwx3//GLbvPoqO19bhxVWfwK/cdREG927CI999Ai/vOIJy70ysvOt23LhwAO0K32S1N8vaQsegis5J03DF1ddj6cBZwDF0eBO++pVvY/2BYeD/Z++9o+u6zjvR37kVvYNoBDtYxSaRIiVKVm+W7NixRrHj9HmTsTPJvHnv5U2Sl5UVp9gep4/jWK6KS2RZ1aKaJYpiEXsXe0EhKgGilwvg9vP+AC94sLHLt8859wK08a3FxXvO/vr+2t4XBLMLsPquh/H0plrEQ704+9FRXImswbqN5VNkjPVdw87tL+Nyyd34vUc3Inu8G+9vfxknPRvw3z51J8IX38L3j8axeXUB2hraUffU7+OhimGcObgPO05cxZiRgxWbtuGxrStQ5Dcx1HER7/x8P670h+EvrMVTn3oC6yqyYRj2ZlbZTMIDnXyk5Do1lvNr6nDXljXID9x8Fx3rxM+++xLaK1dgfnIEzeEaPHhbCO/u6MK6bZVoudCB+fc9jSeX+9FyfB9ePXAJIzEfyus24hMPbERtnoGrp3fj5fevT+LX3vc0Pr4gjEO7d2PP+S7E/AW4bes2PHLHUuT7pv9zA/kFhvMaw+OnqmHUPdLde9G6jp2iWZ5dszP3sz1xyv8CwN4OiBSiDHPWWy/2Bky2pgtWnVOfb95WTv+3J+xgQOElksnX3WobkLrmDF3ahX99+QDaQnF4EMO1+mP4/jdfQ1M8iVDrcXz7B6/iw4sDgJHEQOtJfPt7b6N+wPovrWJoP/wm3rgwjLKFS7C0qhhdR17Gsz8/j95wAh5zHBeO7MKPXtiNrmQSgx+9i39+5SDah6IY77mE13YcxeWr19A/nkCs7zJ++NyL2HVpEB4jiYHW0/ju97bj/EBEYRtsrVHx2Ztf3hp1/2Rgf2/pwOrP8tfRR5Z/1mceT14si/wqAh6O7lDB2z+KzrxnFl/Gi4qnW5N0C7qO70R68fTTiVdqXlBwVQMLrxazdHb3TzcWZHiUnBPtH6V/iHQQ0TqxzQqi+inCFdHaPfyr6pxOvtnpN7Ih0049perDw6HGAjtXUXObap/oWReoNdNuL+XFnKw26donzTULTmKsFS9898d450IfTMPEaOcl/Mezz+NE/zhazu7Hj1/eicahKMz4GM7u3o5vvXEYnaMmPB4DhgHA8MDjMRAdvo73XvkJ3jzTiUjSQOjaWfz4h69gz/k+JDl6ubF/ur4X5Safh4HYeAhdHW1oamlDU0sHuvpDiI014Uffex1H20JIeAyMd7dgx/PfxatNcSSj4+i53onWziHEGfWTsSj6uq6hoy+EWHLiub/rGlqvDyGWSCIy0ovWhtN4Z+95dI9noTAnhGO73sK/v30CA9Ek4mM92Pv6z7D9SANGRtvwwrd/jH1N/UgYwODVE/ju9/8D+67FbM0/vNxk13XmN9n8Kve5WtfIcC9a21J70on+sQgSySj6Ojtwcv9hHLrSAbMgB4HRAbS3ncf2n59CT9hEYZYPF/e8jWdf3I22UAKIhXB5/3b88wv70DMeQzg0gLb2CfzeCFAQSODAjnfwwo7zGE6YiA53YMdPXsCLR68iytSulO905yvd2VnmJ+osITpj6O6fqv/zQDcWUnJEQDmXA7j5OwB4RNZGZOemIbXGOlN1A0QZOmQ3PJQ1JzxEYCYSaD59GLs6gGSsD4dP9SG/dCmWLipHMDiOzat60GVUYGlpBCcPnULTUB96h8YxVH8VrV1RLHv0s/gfjy1E58UzOHZhANHkxP/TaJox9DSfwSvHW1CwZB3u27oKpQGgu2I5tqzywyiqRlVOH3a+9xHCYwMYHh9B/bk2xM0s3PnJ38avbwzgyCsv4CcfdQOIo/VyA5quDyCnZiu2bShC6/kzOHapHh91xLCuOCj0v2pA0okT0TveHqj2g3Kg5OHr7rsqLqlxK7Kb/dvu8G3lwX4W8RflPk9nWVFU6S2LBSstxf/UPdL1IXtgdbIPdvTj7Ytor1R+19Gduoc6uazqETKevM+8Z+s7We3S1UEFvEGHSsfKE+03RSdenZPtES9fWRze/lnXKPWAuqeqOJPJo8aCkxy2Q6sTC6lDhChnKDbq1GcRHStbVU9UvlXFkEgXSrzbtY+nH3/NRO+Vi7jYPYhg+XrcdUcVrl8+jSMX23Hi8hDuCvehbzwHqx99HJ/ZWIIrRw6hxV8Af81qfOFTQ/jqt45g0daH8Vv3r0Bi6Aq6O0PIrdmCpz/9EMoGPsKuyxEUZScRBxBg9GV1U8WfLBbs1H5KvR1qPocff+fcja+3srD2nifwW08txer1dYi0x7FwSRkGzp/EoStd6O4bBqz/zN/Wdyu5WPfQU/iNj62Cp/8qXr1wCYPBSmzdcBtywp04dOAULjb3IlQLXB30oWLdBvzap+6Gp/4wjvb4kBeP4MZxR9inWKD0EhUvyr7JaqWsLrDQceQd/MOR1FMZnvwvv4bHlgCAgWDVSnz2809hY6Uflw5dBowA6u59Cl98eDUCI63Y3tCAHk8tfvd3fxNb8gbw81dfxdunjuJoz+1YAgAIoO5jn8AfPLQK2WPteH2gF6OeMnzyM89gdaAXJ49dQSIrMLm3shiS1Q3ZGUP3HaV+UucYHlBnGytQeiOVl4y/ClI40/6BCGUoYRk5Ga54jYta/FRO1JFJHRZkxTUZj+L0rtdxBgAML4qqVuATH38Q6+dnY+xyP5qbW3Cu/QwO3UiSQHYBEI9iZCSEcCIby+oqEfRmYdFtd2LRbQDiYZwFYBghnNt/CoSWigAAACAASURBVOG4gRV3rMSy8iCABEa6rqOh/jI6Bk8jMaHRRJ2NhNA5HAa8+Vi6uAx+v4Gqkiz4PAAQxsDICEbDwFDDYTzfcFP/8Qit0cj8ojp0Uw+dMhkifWTPugeD1JqVj0pfSuOUvWd56jQflS0qPexcxohkymqBziAv40kdilQgks9rDDK+1IGdYgeloVBjUyceVDro6MeuUfbL6QWGTA/doYDaoO3kuAhHt/da+VgvIkTyRfapcluVozozgRsgqovsmq58p/rqDINu9UHVHork8+hk++2kntitjSIbZPGrI48rZ/JTDAN9I4iEExhpPomfNgMwTcAwMBZPompBHVYvaMGVAzvx07YKFBfPw7q1i1CU50c/wzMrtxRrNixD40eXsf1nw6guK0L10tWoqymbcvi3oy8Pz0kc03LXRF7VUmzbvPHG7wDwobhyPnIiQ+hsb8OFM604fiJ1EvRMJ+eyVv0UUAAFuUF4vUA4PIKBviiM4Va8907rpL6FsQiMvOW4e1059rWcwWsv9WJecR6WrN6CFbV54Jkk6zmivWAv7FQ8KbVQVOepMyVME+Vr7sYjt1UjywsAWaidXwIv+gCY8GVnITvgt7jeh4LcLHgMA+OhcQz0DsEsvQ0ri4II5BaioqIM2TiLa33JGxcAPhTewEd2EVasWIFFjafwwfY3UV9RhJLKJdi2bN60//FM5h+qf3Uucu3MhdbeoVurVTJF++kkR1UxqxN/0y4A7AzVdoYd3ns7g6VbMqmDg2zNG8jC/c98AQ/OBwAD/qxclJYUIOAZwOET53CpaxzrHvttPLnOxMHXd+BQGwCPAY/HAwNJxM2b/0+qaQLGZE3MxdrN1Wg+eRU9zedwuXsZ1pf34uDes+hCCR595uO4c9EwXnv2LfQAgNeAz2MAZhKJJG4k1KQF8Hg88BjAykd+G5/dWATABEwgtzQXdoEa2OnYTwrYid106pMOmemkdYvOyYBOkZvJQ4cbctNFly4/2AW7PWKm7JgJuZmsRU56tlN9dA80TuXpyKTQulF7ZlvfUfGdbfqmo5cxXOD1emAYQO22Z/Cf76ma+I33pons4nkoDZbis79Ti8GRUbQ0nsKuXbtwuiuG//7MfQgynHxZRdj06NNYeucIhgd6cXD3u3jzXDvi/iAeu30hsm65Wm0gq2ge1t5x55TfAXDt0EEcu9iGvLr78YWPr8XoqZ148cAlikQABsKhCJLxiX8UYWLqlYBVJcPwwusFgovuxO8/uQlleX6YpglvTgHKCnPwyH/6PG4fGsVAXyv2v7cbP2vqRzzwGTy2uohkq9u1xs06JiHk/g6AcKgPghuXSfD5vPD7fUAiCQM3/q/5G9738C5NfLlYtvF+fGHRHRga7sX54wexb+d5tMSy8N8fWYVs/63lv9l6ZtHhSb00Ytc413POgP0m4pcKDAOF86qxYH41FsyvQlVZAQIeAEjdaAWQX5qF8e4udA4PI27GEUMOqqsqUZo7joPvHsKFpst4+4Xv4//8f7+One2hG4wDKFvxIH7zgQUYbb6ADz48gZ5IAknTRCCYhew8L0ZaWtAZiyGZTCBhFGFhVSHM+CAO7j6Cyw0XcLJ5ANEEAOSgtroS8wp9aD56EE2hOGLjQ7jS1AOPJyk07VYEp7GYCfpf6nyxgGny/zsTFU26QSWDXXfrOeUP6zOFXgdutdizEyNz8IsHTuvqbO8LTtczBemqfXafVfrpQQAV86tQWpCF3rNHcaY/inh0BFfrOxCOj+Dg9u/gT/7hJZzqGkdl9RIsKAZGRscRSyRheL3wIIHhgT6094+ir+UQ/u5L/4zv7b6IsexSrFo2DxgbR2g8hpmeuJzWVCutaZpIAsjOL0Ew0o+r3YMYjwHxicFTCD6/F7l52Yhca8KphibUX72CjiHRsdVATl4pamtLkWi+gIPtg4jHwujp6kJfKIzBC2/gj//6Wbx8qAW+4lqsrs3D+HgIo+E42Z7Zkl+6EBnqRUtrK5qab/xp60MkobYlu7AQ82urkXXtFF4/2YCLJ8/h+JlGjOUuxx2L/dPwx7ua8MKz/4i/+Pe9GEAu5tcuQpE3jOHRMJL2/n3HLQW3coywMPm/AFgh9WMEqc8sDvvjGOzfsjXZj3PIfrTB+rdVR5beqp+KJwsy/eX8p3BBqnTd9FkBVq9ZgsP1Hdjzk+/j7MKFqPRmwcAwrvUCd61ai/vvuo53Du3H3//LHgRyS1G35T5sLM+a+L89b7BZdM9j2HbuB9j70QkcqavBhjsW4/QH5/HaD36AmtV1KAsaaAsPo284iDu33I4Nrb04dvBn+MePSlERDN9oNgbK627DA/f04c29p/Djf/s3mN4ASmvWY/7tq1Ac5O8JLx5091WFI9o7XnzK9pL9ESNKXInwWBDlhZ2YU8UhL9YpfOzYK8orao5TfMCTyfLWqRuqfWNtougoijlKbdCJZ6sMWdyxcnjPMt4y+aIaSskLVV0U6UTNC9Y2qz90ectiW/RexFOkox2dVDWEZ6/Mdzo4OvGs8p/ID27ozdONorcMh5cfOn6iyKf0FWqdZfeA4ksd3iqdRLwp9VlluyiGePpQc00VX6J4ZiF/6Vo8tq0Xr+85jp9951m85vWjsLIOn1+/DstvvwebW3fh/Zd+jDeTQG5pDe59eDXKCrPgwQKsqMrG8WM78T0U42ufXoOH77mCt47uwzeO7YLhz8PC9VuxcUk1sjk68XQW2a3yBc9mmV90a6F1rXxZHVbNr8e+I6/hny5XYVWlB36/gcFrvYgt4Hl4QqdgfiFWr1uLU12n8OoPf4jy2iUoKJz632ZPholpIlBYijvuvQ9dw3tx4s0XcCJpILu4Gh/7ZBmWrrkbj6/pwp7j7+IfDiTgCeZhzZb7sH5ZiYUX3Sau1hq9lqWzymDxeHEpeneT5qYvrx15B/94xHICKdqI/+cPbufaMAVySrF+81Zc69mJA6/+CAeSHuSWVuHuj9+HVbkBNE2wn4Tsskps3roF7TuP4TvfOIWkN4CymtV4fP0CBL3yHsbzkxXs1CkZb2pf4/EW7S+111HnFp7dMjkif7B8KH4yksmkqeNkmRIUHtQ1N/jb5SELGH5ghtF25SraBsZRvfp2LMrHdPx4CA2XG9EZMlFcWYmixDDa+kZRtuQ21JUFEB/twaWGdvSPJRDILcaSJbUoz/FioOMyzrUnULtiMRYUZWGg7QouXRtDQe0yLC+K48rlZgzFA6haNB++nlZci2dh0ZJlqC4w0dXQgIbeEAy/B50n92NXwxC2/cb/jc+vzUMyOoLGK03oGokCXj+KqxZgeU0xApyf+aHGgRt7IQNd/pTh0015dmnswmzyN3XIBdRDjlu63Qp7MVt0dEP/TNf6dPqO0nApNXCmaqUbQNUxU77S1WcmY1O2RvWXXf1nY8zpHNBFtOm0Mz42iMamJlxHJbatroI3NQfFRnG1vhHtQxHA40dBRQ1WLixD0Iyh91oHmq71IZI0kFMyD0sXVKMoy4tkPIrutkY0XQ/BLFqAu5aXIzY2gOamNvSMxmD481C9cCEWlOfAy9FFN955QI0X/b0YxpnDlxEpKkfdkkUonvLvHWLob72K8x3DCBSWYVGRB22dPfAULMSqKgNXm1rQlyjD5o3VGOtqR/3VHuQsWoO1VdmIhvrReLUNvaMJlFYtRF6sC81jBbhjeTXiffU43RpDzbJFWFheMPGtZSKKvs42NHQMIGoayCosw5KF1SjJ9iE83I36xg4MRRLwBHOxqG45avKn/Wtnss1OIb31JYmRgWu4fKkTY+xSoBRrV5Wi++IV9GfPw6rF81GYBQxdb8HFq0MoWbwUyyoKMHFmj2Oosw2X2voQTXqQU1KBuoWVyA9Y8JcsxbJ5+fAaBsxoCK2trWjvHUXSE0BZ9XwsrixBlm9merxurcxEbtmFTMbj5AUAexMD8G8lrO9FeLybjdTnlAIyXqySPF4quTJ83rNMDwot61yZP1Xvqf6U6plsw0//7S1cGIsCyRhGBoeQyF2JL/7xr2NVjqGUo+M/R3py1mS+Uq1R8GWyncQQ+46CK6NT+VM3r3Rin6Kn9dkqX4e3ToyJbKTGj8hnTv1nx2aRv3jA04/KS+VPHq0o/qg+0vWnCt9pjuoAT5ZKtmhdt37K3qv8YX3Wka2Ly3tW+Y+ahyJZqXUn/Yi3rmOfbg9R2eTEv6r4o+pit/+L8EU6UdYz2aN1e58ufUpXN/3rxD9OfeB2vKrqARXfbm2W+VcV2yLQyYWZ7IV26oOKtxv9SgV243Um/KnibacP6fqTUqNN04QvRWxlxGNOVSL1zvrMrqueefTse9Oc/ps4ec88G1h83obKbGZxrXLZ4mSVxerP04uVxf4t03PKM/JRt7QC7Vc6ETaDWLphM554fBuW5XqmBSHrD54eKf15urJ+YvWiJJ9hGFLZvHigxozMX6oY4b2jJByvSYl05AFv32U6s3rIbFbJEeHyZPN8QNkvil06dljli/aA5Z2KOVUNk8W+Km8pzYOnl8g+EY7duiXSQ5YPMllW/VS1RFar7fYfau0QyeXR8IYbK61IN+ua6FkWLyI7WP/ycKl1TWavjBf7zNNPtBei+FX5V2SHbH9lOWd9Fumj3XctdLx6qKrdIhzZ0CmykzrXWNft9hRZzVfVYh4/3jPFn6Jabaf3yeY6O/6WfbZTq2XPuvFFySmd2E/JoczsFDut/GXvdWqHKB5VMaqyQQR2awlPtigX7NZqK46dPku1ibcm6z9Wu+z4jyfL+o7XS1Xxqhu/1Pqp8ywCkSyRzobJyygBqIYpN0AUnDOpkw6kU5/ZZqsu6Oo/0/uvSv50yHBTVqbz1W2+gLrg6fCT8Zrt/k73Xmaa/2yvZeyhJd257zZ/1aGelTXb9iPT+jiVl4ncv5Xry60Mmez7s13Grd5H0w2Z7KOii0Jd+ZmsXenoc4B7c6IO/1shTlU6TvlfAFR3AbxbFJVw3Xey2zeNuwrHOtmlFd1SOtGFGuRObKPycyLfjWTJhL+tvGXPbsSjyCcUX7ntbzv2yGqCU/849bcOvkqW9XadykOlSyb0s7sHFHudyKLsrdu1S1e/dDd41TdNVnCzdvFqZjr7lh1+bkAm45H3DYsTfm7J4AEPLxO9Qkab7rlMB5zkBoVfiqcOvh1IR29W+cKNOqb7JZFTyESspCOW2W+uefJni79TMtzOJdHBXIeHbJ3nYyeyKZDJ2jXlAkAWPKnPvBso0WceP2pRcsJPpHeKBytTxSMFIvl2daLSus2PWmQo8aDCp/LQ4WfFT4e/2ZjR0Y/62S6dSr4Tnaj5L9NJl5+INw+cxiNVDx5+qhHo5JFb/lHxS/HSrbcyOSp7df1NrUPW927Fo0g/3TjQoVPZ5gaPmYhHSkylgOpvnS8W7MYjJf7d8vdM+UeXH6u3zmcRZMo/dvjJ9EtnPPIublS9hsrbDf/o9mg7tVxG68Re3fnfCQ8KrdN4VPGj6KrCV8WjW75iZVF5sPgyWt472aGXIj/T8airn0q+jk6GOQFTCCm3eLwg4gWeCni4PP5Ovolxm94OP1Fi6srW0Ycqx6k+TvhR6H8R9p+ij939cqqfiJ79m6qrE314NchpvKfLPzJ+s9E/Mp6Z5JdOfezWS1nvS3f+p9s/dnsPSy+rByp6wN5PgDn1tR0ebsjUAaf1QKf28HAy7R9de53Imwn/2AW7/UuVX+mo71Z5mapnTuYjq74yXB19qOAmvaz/p8M/VHq39Zkt/k49A/bPt1Zat/Rxi9+0/wWANdL6txWcDrcsP55sFW/2HU9XXiBSBySejjK+PNtEgybLS2Qfj0bme4p+PBonckXyre95MWSXryhBZbJ5n2WyRfukik3Z4KDLk+XLs43lpQLd2FTpaCc2WTyZn1SDIU9XEa6sFvD0o9QJ3di06qjyqS6eCFSx6SQvdWKdx5Oak9Q+JOoRIlwRqOKO2ldEPHUHT92eZqVR8ZT1f57trD2yWKL0ITf2XcXTTrzL/C+SZ0dHmWzd+iGKTR1ddXJIxE+Ey9OVp7tdfjJcO/3SSieqoZR+JbNVVpdkOLxao2O3igdl1mFBlUOqWqMbm1TfU3g6yXed2ctp/dCNOx5PVe/WnWVkkK7aIcOnxjyVn0xf1WxGrcWUXsnypugnwgWg90sAUwKohXOmId266vK/lXznBlAPKJmE2bQHs8k/lMGRQu+mPsDM+4Zy0MqkHrMpfmcTqA67M6HPbNonN/3j1LbZ4BudYT9TurjlFzf2B5j52puCOX3kMNP6zJYeSZE/E7pRL1bmwB7ILjOc8PpFAZlNHisSj1D27PY7t/m7yYt62ymjk91y3sq+kN06qW4QM+0LnVszO/x19sOOf9IVF5Rv6GTA+0bAqV6q/MpE7dG54dbF0XmX0kNUQ271euGGf1jfuFF7eECtM7Opp7rlH7t0lD6YyfmCHRh5/qHycvpO95sf1TsqrQhnJn0heme3DqdDf5l/3N4jnVkrXfx181kndkTveGC3Z/N0dcJf9x0rMx3++WXu/1ag9l0KrxTOTMydbvKX5YPP+oJF5iU2r3lZaa08RE2NHdhYXOtnSlMUybPqw67JhiDZjwNZIZ6M42jH0clnr+HFhvINUn3nYA7mYA7mYA7mYA7mYA7mYA7mwB4YhoFAIDDtzCg6v/HwrLxUZ1Kn51vRZS/1Aph3PrfayLvYZsGqw5RfAihixGOsUpyKpwOyG0beZqp0cKrTYHgQxV8rnnwuDBai6febbPObgzmYgzmYgzmYgzmYgzmYgzmYAzF4vV4UFhaS8XXOhKIvhHl0TuTw5FJwnf4NAD7ZrYLVeNm6yngRHsV4GQ/exoh+gkF2+0IFFa1hGCgpKbFNn25It3xd/jPtjzn4xYJ0x186a8cvAvyy5f9s03+m9HFLrtMLet2hzCk/p/i/SDCbfav77dpswBfRpkMft3RwwudWee8WuOV/t/baLT/M9pqpOpeqzpIALdd05FBlseu8v3k/Pc/+bQWPaNNTf0SEPPzUZxXwcFWyeLgsyC4OeDROZImApeVdnrDvrf4WyZPxVfk+hZ/yAwWfJ0vmCx5/EY1VH5VtIj5Wnaj68WRRQIe/SDcZHbv31P3kfabYohPTlNhk8XVl6drjJD91aWTxqHovilkZHyf5KaMR8XciiwU2n1W6ifJfJS/TtUCn1sr0sZOfOrVApZeIVqcO8mSp+ihVjqx/UOJT9V4067D4IrtE8cX2Mx4+K0sn3zIRO27XAp4OVnzRTCarmW7gq+ip+Kz+6ehV1rhS7Q97gNDBt8oS6ajKBUrfYT+z8cCjEfUI6peEOvhWvXhyWZ6yWiDD572nxjYvj1T6WWNVt2+pcGWyKPx5NZ8ng6WngE5tE/GX5Q4vTqi+Y2Wp8o5aq2XneVZn4MYvARQZqbpNZxtf6rMoqVgl2b+pG0vBpyQKpdiJbnqohVKFY+Ur87k1sVg89ubHytu6J1Z6lieLz9NXltw8G0SFl90/1hZe0Mt0oujH0vF4igouj78s8WQ3bqwsVn8ZHcUXPN1YXMogzMaODETFWzUQ83SyxiqbJ6L4FNkh2k8RPovDNime33m4PP5sDqbWeHvGs9v6meXDy22Zb3j2iBqx6oKY1Y2nH2ur6r1sGJDtv8ge9o9o33iNX7ZHqvgWxTXLn0fLypblrKh/sHsk8hlliLTiq3CsuLK+yes9rAxRLqSeZflGnSes+Lx4ZvF4slTyKPnGw2H5i3wmqqsina18rTiq+sryttLw/Mfii+JfxFe0xltncazxJ6v91mc230XxyspU1U/Z3MHKl9GL6iurI6+PqvKB0utZXDZnRT4W+UFlh0g2D1e1n1S+vL3i1QMRvqxfiPo0z+/WmErRy/qILN9EfUQUL6KZh6evqBZQaVhb2Xfss6oOsPvOq3MiWp6eohrA209RDslqByuTF88sX0pPFdljxfOwyDoNQBQ0IgNlya5qoqIEEW2QaCNkzuDpJZKvUyhl72VFWtUArXgiW0TFyfpOVJSosSBLEBGICqUs6CnyRe9lfGRDo2jfKU2FWkCtz9TGJ8ornYZP0dMqjxrzLJ2Kh6qAsQ2Q5c9r9FbZbE1QNTpeA6DksVVXlp6nk6pp8HQR2S/LJVlNFOU/73DBDiE8X6r8w1vn5RzLk+dnGfDoeU2UtZ+XSzz/yRoti0PpIzxbrXqo7GNxRTWdpee9Z+lF8aGSz4txXvzzePHySEZvxbG+E4HMPlktsAJPvmz+sb7j2Syr5SwPUXxb12UxKpqZZPSy/WHXee9E+aiqWTLePJ9b9Zf5h1e/eHvK018Uf6x8lX9011X11Aqy+LHiWNeoM4OMp2pdFfOp9yrdVbJE/Y4Fis1sfLB7TdGHoiMvZih9lZcLIlqVjpQ1K1BrgWqN6i8VUOy24qp6paoHUONHpJ+o5lP1sZMbKZh2ASBKEMrBhA0E6jAiczArVzRUqWTYAbtFMUWj0oVnm27RE+GJ9kJFr/KlbMgRrfNANBTLdObtPU8/3mcRT1Znt/yvQ8+jocSPisZOEbS+s763czFBBUqTol6yWOWzg7mqZlB4sWuyGifzhU4t1PGPrv4iekocqWTarT8ymTIamf6yOObtv2jY4/G0Y4vT/VfRU/S3AvVALNPTSq+qvTr7xwNVfFrtV+0T+152ocXjZ6d/iOYkVf9U+UeUfzL57HuK/TrxS50fqfpTDtY69uvSU+yXxZ/owoKilwpEsZhO0NVZd36kxI/Kx7JnHT+pzh9OgWILTyfZrMPjIXq2G3My3VTvVfGj61uKv6ygGz+6F3sqXdyw2aqLzoWEz/qgQqYyZZ+dOIjK000Zuut2aVhb3CjYbvjHqT90bNfBSadtmWqWVEhXzKlo05HDbupBxWffUQ5BdgdmFW06QDcH7Ky7WRdnOr8otVZXx5m2yU1wevDg8XKzRzsB3ThOR65Q+KVjHtCRL3q2g+9mPKnkZxrS7S+n4KQuZ8K3bucjhcYtOzNR2zIRX+nSX3dus8PTrkzZuo5/MrHX6TzPWmHaTwBYQXZTKcOhrFHw3b75cUvOTIFTPUU3g7LbrVvFNwDttlFFf6vY65ae1P2ezX6h1CkqnV2eM+0f3dpn96ea7IIbtUvEy+7+68jQoc0kqGqW3Txwg2+6wO7e2NV5NseCG/36Vup7gLt1+5cJKPXtVvOVjr6Ub8ZVMm4l/8jyOl37P1vPfDp0t9Iei4Bqg/QCgAeymxGnPxrh9FaK/fEHkRN4cnSbILVwuFk83Phmhme77HZLR+ZMJ46d20brcMjzj4pO9i6dlymZvrGlwEztv+hGV6UPS8fGggyfzWsRL9Gz20DdNyc3zE5qgVvfKvN4UW70dX4szo29ytT+q2qWnW/PVHxF+cHi8D67AXbnCjv7SxmUVba6PQdYwY36rdP37EAm999uL3ACmez7ToDyLWY64iCd9uvsbSrOVX2eR0fF1/2CLZ0gy2u39l+3z6vwnZ4ZqecyWS+Q9T0V/9lSC6h+nHIBwBpopxhk8pullL4inXWCkXJItAK1cNgJUB093KFLIByNTuCZSUSjCcQT+t8MuGmrHbDzTYZ1OOTTjuD8pY/Q0j8Mk0PH40V9dvrNi9v+lfGbckmWjGM8Mr2wqXJIt3g6ATvf+rGxoPIH77PoHaUWOYkHu7Tpkke11w1dqKA7KOrQpuNHLGeqNujamqKx24cpMt0EnQt/yuGYtVX3kp0CM1Eb3AI7h4pMXxo5kcfODm5eqovAqX/cmiWpOeTmjM/jL6MX4adj5mdpdXM/fTO+mC7TtdcJ2OlNLL2dWpyi0+kFVlpdeTzadNBMuQBgb8h4zFS3WSoH8HjIvlmT8Unpq9JZxENWuO1uGkVn3hrFz2LfmoiMDWA0muDyUBVgc7QRz+3cgdbxCBBqw7cOv4v93cPag7BsX1W2qdca8fxPv4KTw7y1URz/4F+xvzfMtdXODaxpmoiMtGH7G3+OP3zvd/C5F/8vvHLhOhJJvZwwTRMdZ76CF06eRCI5XfZA6+t44+DzuD4+Xb5KZ1Xcx0fa8O/vfQMvXu3Vii/TNNF//Gt4Zs8VfjO7fgCf/+DwNF1kYI0lkc6Tg3l0BH0j0cm1tlN/iZfPNdquDTI8GU9K/Kp42NGZtyYCdW2Qy1bli115KhAdlNzwpagvKeugjR7iFh0PlxILqlxyW2fRGrufujVX95LAaWy42dvciCkViIZPap9wSy834kaGZx207dQl1ZrdXqpa081VCk8ZyPY0Hh5G68WTeOXFH+CFY9dhmumrZ9QZz+7c67SP69R8Gej2ceuamYyi8/JRPPftb+Gv/v4b+NeX96KhPwIrmd0+zpNJAadzQ+qzuzO+aM2EmRjFlQM/x9//yzfwV//0Xfx411n0jsXBc4eMp+6lDwWPMnvo0onmM9MU/0SJndnMl9pEUdLIEii1ZsUR4fLeW2lkPHQLuNXhKtt4eLLmriooPJ9YZajskW2oKLhMM4SjOz+HszXfxRdvnz/lhpO3j+xnIxlBfyiE6I1i1Tc6glA8MU0HJ4Eu8rvMB1NpIhgYuI7xpAnTZPXJwR0P/iHjE/4ei/RhYxGI48yef8O5kj/A9if+N7JDF/Hdt/4Cr2R9Hc8sDk6zTWSPYRiIjXdhIDYOXtTEo0MYGh1BPDnVbmsciWJOZNukTcko+kZ6EIkmpuBNt3XqmmEYSIx14+pIhGuPGRtFaygmzQ1VPsnwhi48h4cuLMOpz30cpmli/oYv4WmG3qory4enDwtuFWOZ3RTerK6sryg5bOXL7qNoD2T5LJNDXePZRn1vBVUtZZ/t1iiebbI1VX0R2afje5E9KltVeGxNsWOPrK6KZFH2mwVZ35DpJqoNslik1lnWHie1x2nOUPZRxI/nL4o9Vj/IeLHvrbSinLVbe6y82c+iNVGuszRsz2Jtln2m7omo/lPsTr1PrTUdfQ/vtfgQCA0jUhUFrHBE9AAAIABJREFUIN5bXt9Q2aRao+isqrM6+cjDkdmjU7NV73m2WnkbMNHfehk7D7fjto9/Hr9V7cfV47vw4QeH4X/8HizI8whtpcYvTwdKvIh8wPOVSo6It4ifKFd5tcEwY2g6vA/vteXht77wRZSZfTi0YzfeOp6NX9+2FH7PdN1Y37DveO+pvYFSe2R+cJqDshlGZI8oXnxWx7NGqwqkdU2Go6IVPaveU/mJNkaEJ3pH1UfGzzRNhIdacLz5IE6H+1CRswX3LL0dVbk+wExibLAJR67uw4VIBDX5d+OB5etQFAAwVI+fXA/i0bxr+KD9JAaNGty75GGsKTRR37YDb3e3oCHyI5Tk/ic8uXIRhhuPI1S4ACPth3A9Zzm2LVqPvEQPjl9+Hx+NDyE/ax0eWL4F1bn+Gxre8A1rSzKCax3H8GHnafQZC/CxBQ9gTWU+PEP1eL47Cw8Em7CzJ4Gty+9CXUEODIuto33nsavpIFriQFXBvXhs5XLkeT1IjvfgzNUDODbcBo9vFe5dtBXLyvLgAZCMjqCp7TAO917GkFGNu2ofwrqqwon/rsJMItTfgPcbP8SlqA9rKx7Hx5ZUwIso2uqPIFa1FUvy4mhraUY8rwDDnYdxaKQPJflb8NDS1SjJ9sMwkhi+fhF7Wg+gzSzG1oqt8HmSqCmpQllu0BIjw+gY9ODR+1aiwA+geDU+cft9+PlQHwyjBogN4/SlHTgS6oLXvwzbltyDFcV5MAwA0SFcadyDvUMdKMnbitqxBOC/4d34GNraDuPD7vNI+NditRmzxIiJscFWHG/aizORMVTkbcJ9yzZjXjZgGDHUn38X+4ZbEPPWYtOC+3B7RdENXycw3PERft5+FD1mFlbOuw931y5CamfjoXbsP70Tp8JxrCjbirsXLke+34AZD6O94ygOdJ1DVzIPmys/js2LyybpEtERXLz0Kg4M9qAg5048sfp2FPhvxkhqn2NDLTjY9CFOR8awrPR+bFtQh8KgASRu8u82C7G58nFsWjTB3zRNDFw/gb2tJ9Ce8GNR8QN4bMUCjPYcx5tX96Bn4Bye+yiEh5f9GgqH30WLZzPWV5XekNeMQ437cSoawoL8rbh38WqU5fgxPnoNbd29yPbGcfj6EfQbNdi24AGsriiAV5HDquaq+izjTQXR8Er9zDZS63ueHN06xquf1jVWbx4vynuVHaq94/GWrVF4yeTK+PIGex05Il+nhhIVjQ4/nj46cwHF9yyNLGZkvFWxKOvblHlG9J6Vq2OXatYS6cyTKfKpKkZ4ckT5JlqT0ck+y3Sn8GLfiWoHRQeebLt1nupTFW87OczTqe7ep7H8YwZa972GnV4g1bF5+29HN4o+1HorskFEp3MmEX3W2W8dv1t1nHw24+jt7kBwwTqsrc2HD8CS1RvR0HsGXd0jqM0vmjJP2ekHdvXW6ZcUOTwcHXvYd5Nr43241OvB5i1rMC/bBw8qsHXLCpze1YVQfBFKgj7hvCaSq2tPak0Vf9T3bueg9VmHXvpLAHWS9lYAWbBlCuKhVrxz+HUc7k6gKKsE453HsOPUHnSNA9FoE97c9SOc6/eiJKcIkbadeO7IYQwmAPSfxVcPvYy9F68jO1iG/JEr+P6ut9Ca8CAYyEeBP4D8YAmKg0F4EEXT+e144cAuXI/noyArG16jGx/sfhb7rsVRkFOMQP8JfGfP++iOT3oCAKZ+S23G0NH6AV47uh9hswiF5hAOHnkJH3VHgb6P8JUDL+Kj1nHkZecj6JkIpclEDNXjP3a9go5wHsqy8jDc8Bq+f7IJiA3g8JldOHptBIVZpfAOX8abR3egeSgKJCNobNiJN8+cB7zFKEyGcODoSzjUMQQAGI/04eiVYwgbxSj3hbBv39/hUFccQAT1Z97CheEoTHMU9Vf24KW9L6JpLIiyLD+uXX4er529iHjSRLj/It488g6ujgVQEgiiteEtfHPfB2i78W33zXjIQ1HOOC53DiD1Dysqlj6BTy0tBTCOS0d/iD2dJopyS5ETqscP9+5CTzIBIIzGi9vx9uUO5GWXwBdqw7H2evQnASCO6x0H8N7pE4h6ipFvjuJ80zFcvXEHEB3twK6Dz+NETxLFOWUYu3YM75zYh95oAp2n/x0/awwhL6ccBbEevLF7O5piE74ea9+Lf9z3IcaMMpR6vWg8+yrea+yc2MtYC040ncNwPBfFRhgHj72GHW1diAHo7jiEN06fR9JXgvJgACePfBvvt4ykNh9DvXtxqd+H4twCxK5uxz8evoQxJp4TQ/V44eDPcLzfQFkwG631e7GnoR7jCRNd7Qfx5umLMH2lKPN7ceLwd/FBawgAkBw+hx/tfgu98XyUZWWj58J/4Efnr8Pry0VhIA8+byFKc4oQ8AK9TT/BgdYuAECs9zx+tG87zg4YKM/KQ6jtXbx4dB/6wwmEhpqwc+8P8X5jK4KBYgRG6/H2gZ/gQl+YnJ+UQ4KIzq1aYpcPpfmIbo0pvFTN0W37VQ1PRKe7Zgff7kDrhI8TGjd5i4Zy0bOu/RR6t/dTJp8dLlW8qJcaqqFVZ/iT0VLlqL7JpdKpnllg/aXyv2qdx19GL8OnPPPoqfakA9yuN27rANj3gSh+3arHboCVfzKRxMjIIHLmlSH7xjtvTi6KfD6ERkOIS2jTDZmIEzf4REdDGAt6UZybM3lg9ZeVo2x4ENeTySlyMrm3VPzZfI72WR9kjUu0Jvv2gEKjA3b4ObXJDZjkZ8Zxvfc8+mPl+JX7n8GyPB9iQw147ewVtA6MIN72Kg5mP4G/unczigJeRBa14s3dz2F38234lAfwjgewYsujWJObBcQGkP/a7+Bkz6/hU/Pvwr3FVSiqeQqPLa4FEAJwEbH8z+OhDWuR5TMwevE5vBS6HV/9xGMoy/LDjA6hYuff4Kfn78YfLbmpq9XqWHgQh0+/h7y6P8bnbpsPvxnCsY/ewZXmBqwqBbzxIizf9BCWZAXgMaZ+e9p69jm0FX8Wf7Z1LXJ9QHj5Zbz61gm0LFuL62Ef7rzt41hfkYfEWDNeOXAcXUODqPElcK7hIBas/hN8sq4UXnMMFy/sR/v1JozWBOHzxbFi6ZN4fEkBAkYEJ0J/ix81deGeysKb+hsA0AYj90E8sP4BFAVMDOe9hP9y9ho+t3EZrnVeQDhnFZ7e8gSqAwaG2/fg3d56jIC9XQ5iw7ZncPaDv8VXGrbh6U33Y3FpIcqzvMB4Iw521+CJR55EXV4AyWgfSl7/Z5ztfxwP+pvxSksMGzf8Kh5eWAEzNooTY9txAAAiQzjceBWxBU/hN9avRABRNHgvI9Q5oXtP50lciK7GM48/hYVBPyIL6vHBmUO42FuLsXo/7n/8V7EpNwgkwjgx+Ic40vabWLpkACcvnsX8uofwuQ1rETQSGK3agy+fvYYnK0sAFGHp4k14cMMqZBljOIVXcbHzMsYWVGGw8wyKFj2Dp2+rhA8JXPK/jP1XGzG+cAMAIL90Cx7cdB8KgwZiSy/gOy8/hwu3/R3umAzscVy5uh/DnkV4estTWJBjYKT4A3z3SgM21C7EWOcFlC5+Gr+6phI+xHHe/wqONDchvGAtWk98E8O1f4r/emctsrwmxpacw892HkX4tk/hvppNKB5ahk+teAwA0DApbwyXW44gmlOHT299BNXZXkSWXMLz7x3A2dAGrMIgQp4xrFr6IO6rLYA51owX9u1GQ28/VpVWw2ujVqnWROB23XGrJslu5t3Uj6LvbPK56lu8mdaP9x6gf7sje6+KCZXeLDjl59SvqjiU7TkPdOOaGkd280PXf1Q5lAtEHToevUg/2TfmKn2c8rOC2/pR+FF0sK7xdJDHpQlM+9lOOR1VP7szv25O2dWPfS+Snb5zgol4MgFfwHLU8nrgM0wkkokpX7hRapVOn3L7HCMDkX6yPkXVL5FMwvAa8Ho9N2n8PgTiUUSJ90iz/exI5SfLPTtyplwAyJiJgk+U1BQaXSey/NgGJFqzy0+kk25xnMQ1E+gZGESs+DYsyPPBYxgIFtXhs/csg2GYOHT4Jdy+9n+iODiBn5VXgaUL1+F0XycS5YA3qxI1edkTt2CBEswLXkNrhKcDAERRU1iCoBcATLR2vI61S59FeZZ/Qp9gEW5bcx92X7yK2BLfdCYAYvEuXB/sR9B7FYfbrgJIoicaQ9wYQBiAN1iG0iw/PIwrDGMETZ0G7ty8CLn+iaTNyl2Fz//aKgBAzdb56Oy/isOtg4iaQ7geH8V8M4FIvA/j0TJsqCm78e96crFm7WNYA8A0L8Dvq0JNeSH8HhMwslCYPx9doTEAhVMVQB7Ky+Yhx+8FDKAgpxLdyQiS0TBaBxJA6RrMC3phGAYK8yuRl9ePpCUeUlBYsRV/9Nnb0dV8HK9++Be4lvU4fvO+R7CyYCl+76kKtPZcwuHeQUQBdJkDKEuaGBluRoHfh8VFpfAYBkx/Lubl5iEYA6KRISTG2rG8bjGyvBOXDEW5JSjwTXzr3tvdjItlT2Fh0AfDALKK6/DkfXUTcfSpX0dnTwOO9fYhDGA4OYZIDMBYP86G52FDTQ2CXgMGfMib/zC+Oh+IDTUC/kKU5Zch2+cBEERhTg68QxEkTKBu8xdRNtCCs20HETLj6EuMwEzEJv8xiD9YjqKJAII/ZzU2lAzhVMcw7ihIBcgoGvtGMOgLoL73AJoBINKD1vEgYvEEVtz5X1E+0IyzbU0ImTH0xEeARAxJcxD1nX7c9fhCZN8IvdzC9fiNz6wHAAxyoxFANISm4SyUV65Cec7EP1QIFqzGxyqex5HOQawqSaAoNxsV+YXwegAEclGQnQPDjN6IS3mtSoEo13UKrpWGfdYdtO3wc9I47B4ErJ/tHm5kutrV27omGkRlBzQnhyqqTSqfUwdoVd9zMrhT/WCnj1JpdNZE+on2nKKDzr5TZhAZsHpS9VPJ4sWSG4cFJ/7j6UD1OYWf7AAv6wsUfio90sWPclFgl58oN3hrIn5UsNN7qfVARMfGFtWmTB22RfrJ6pmMT7oveigzg2xvRTzYOHaqq5040j1zqvjx3lP3RqW7rg7ck5/swCwDnUFJVqCoAwclaXUGBFXRozQkWbGBCZjJ5MQBaxpeEkkT8E3jnUQiGUdSKFEOE7wTSJomfAZ7kDCRTEaRgA/g/Io6EzEMjDXjSvN2nE/9w3BU4K5l9yALHSkBHNtNJC38rDKT4z04cPp9nOxpw2CwFyMYQ3tfJVbesFUUFjfF2Lj1mvyQwHBsHKNeP7yqghXtQ9NgAEvn5aNy6Tb8t6WbcOSDv8VLJ5fgz+6uxOmT27H/+nX0B3sQMoC+gX48bQLR+DACGIXf42V8AiSSEZjxXmT7+BcuSeagejPeQrh0djt+3tCF4bxrGPIA4d4GbKoDYJpIEps9i9Zx5T28fPkyxoP9GPSEMRweR03eRg7djQLtyUZi6pU1EmY3znefRm+8cPLHs7ylDyMn6EPb5Xfxav1ljAf6MeiJYGg8goWFdwCGiYn/EEH8zYTYBvOmMZO+DSEan/4/YBhTX0yJVRFvNr/ZJsXDl72nNA4ZLxU/EVDqsJ0BVDVQUG2yU+Mpg45qnae7bABh34vsZ3nY7hECe2Q6UPRmaXk+Fw1ldocekU6yPBPpy5Olk0M8vqxcVg7l0CPbd/azSF+e3ro6yHKSh6u7RsG16qATI6L4EvET6SHLC9lsp7JNxM+pv6yg4qdzqEnxo+gimnGtf1P0UwGVTlX7dQ6ydnBFf9vVz4ABv9eHaDg2uY5kAjHTgM/rg8cyl1Dji1e7ZLWFxbWCLFd1+gfPJzJ+PFtF4PN6YcZNJKwzXjSGsD+ILIPPT6STnfiV9Voqbzv9khq7KhorHUvPPYnoOknkHNmQRAleSkJTm6cd4DUkFUhlejzIz89BsL8Lodh6ZN04VMdiMRiGgbKCO/D29Q4kltXACyCZiGGotwnBqgfgx0WJDA+CHo/ll4mwgr2YV7ABF653I44a+G7YNnDtLPyFmxBEP3gHMZ9nHlZV3Yt7N/8tPlbhnSq78ZjECzmYlzeOnT1jQO3Nb+fNcBj9/VfQ1N+HrZv/AFsq82Eke/DO/sMoBODzFMDvGUD3SAyr8244Jx5H1DThnbyAsJHAk24IoDLHj97QdYwla5FrmDATESQTN/9l+6R944149XAYX/jkxzDxhXcQVVWrkWwdRnRwCD9t8+H3HvxDrCzJh8dI4MQbf45uA8jNrkJHZAS9kXEsRC5gJhFNTFzu+P15iPhq0DwygK1V5fDARMJMIHbjdqegoArV165jGEtRgIk9isfjMMca8bOLg3j0wf8D6+cVwecB2vf8Ed4HgKxc1PiG0BcaA8zSSWPHx8enJTcbF00X30Dxii/hCyuqkOM10Na+A7uvcPxnGDDNcfSGRlCZn3PTn/4gKgpuw9PFn8ETGzcix/IbRcxkHHsuvY3SlX+JZ5ZXItsLNLfuwP4mAMhDZf4IjneH8UhpdsrxSEQiSGRlwefNAQzOryfxB1GWFUbTSC8iycXwewHE+1A/VId5S/Kn6Swznjo0yXJfVGNEuCocEchqo51hXtWQKbpQaCk87dZn2WCmksPbC9kAwuND2WPqGmXdDR1U68Ih1hAfRCk6qPixQJVlN6eoQ5ST+KXMHpR9pMwxFH3tXBaxtCp8ymUFRbYqVlSHM919U9USnTpKkacrR4Wrlq9Py8af9Z3Tiw/VO0rvEtFS6jwl32TydGwxvF7k5RdhvLsHYyhGjmEgMRrCYCyGstw84RdRVtmUXic6q4j8xbOZVx94/JweYkX6iOj9uXnIjcbRNzqGpJkFj2Eg2nMdvQVFmOdhf72z+kKfxaXEp905hQUVX2U8afpftX/SXwJIBWqyihqQbsE1Tf7/hcgGfbo2TRd38p3hQ03JYowOHsPblxowMD6C3o7TOHDmELrCXtRs+jxyL30db19uwWB4EPWnn8c7Q7XYtqRkSgmfLiMLZfmVaOzrwGg0jATnxwVK138WK7u+jx+fuoL+8BA6L72Ef63PxyfXVwqDIBAswaLqhThx4k00Dw5iZHwQ9fUncaGl7yaSdR8ScUTjSQB+rFj3JDo/+j72tfciFBlCf/s+/PhkK7I8HiQSJmLxcYyMD+D8mV042FSPcQDBrFLMr6jC4VPvoGVoEMOjXTh+fi9Otg+5E6jeHNRVVKC3dReOtl3D8GgPjl3ciRPdPTdMSSIRT0x8O523FDX938K/HzmP3rERhAYvY8/Jt1FeuQzZXh+88SRiyQTGxnpw6cT7eLerC3ETyCpdjjtyOrHz9HH0jQ/heusR/Lz+I3QnAF92CVZWluPqxR24MjCA/t567P1oBy5FJ/azonotavvewNvnGzEQDqG34ywOHd+NHmSjIDmOcDKBcKQfTed24vWmLiRME/DNw921WXj50Hu4MDCC0PggWs+9iZ3NA9z/dnCKO7wejIcjCMfH0Nt+AtsP7Uf/5H6aKO/egXebejAcGUTz8efwrucTuHu+/yYDTx7WVFbibOMh7G3pxEhkGD2dZ3Ho0lWMRCf4hyMT/HvajuHNwwcwYJoAAlhz+6/gyuFv4lhnH0YiQ+hu2YUXz3TBByCnqAqVkT60REcRsQazJx/rqhfgYuMu7KxvwchYD86d+g8cjBRiTWGJViioBl7r33b5uKVPOvFmE7B1XQZu2+eU32zThwKqPuqWPrr80m17Jnwrspnnb/YzhZcd2XbBac1xO7d05jtrLRf5eLbVypnUR3c+F+ma8rd1ZqfKcCPeneCKzikUftNoDR8qKhcg0X4aJ+p7ERobwoXTx3E9mo+ainzSXKt72BPVdaGOEhlu1xKRDCnPrFLcVuXB8YOn0To0jtBAKz48WI+yxdXI9U33oJP9E73jgai2UGcYu/q4dh4F4P3Sl770pdSD6qZPltDUH0thaXh/q/RJ/WFvN6z4Tn9aQMTL+jkcD+NrB742SZPly8Kf3vOnkh+/MeDPrcCqoix8dObf8OVT38OV0cV4aN0DWFTggz+rFmvmZWPPib/D3596CQ2JTfgfj34Oi3MNINyD46M5+PiyRUj9L/TDvSdgznsKi/IMlBSvRtOlf8K3rjairvwuZI1dRLz4Y1hZmjsh2TcPG5Ysw/mT/4D/deKH+LC/Al989PexoTgAJEbRMhBFXe1CFBhRNI+EsaCsFvPzclFdsRIF4yfxzQNfxrPnDyGQcxe2LV+MrFg3Tozm4YllCyf1GWk8gHebs7GyOhe+/KW4o3gMP9n/1/iX0zvQEt2E3962HkVFFSg3u/D8kS/jm+ePoqT0AWwqK0Z+0TxUFpagdt4SGAO78L8P/T1+dKULKxZ8AvcuK4cPY+i41oPqZVtQ7p/w7/jINbT5FuD+ylwM9rQhULUR87NNDA10AwVLsKykZOL3E0QHcHo0iIcX1qCoZBHqAiN48ejf4psXT6M29y74AllYPX85yhN9OHnoInzVtcjzZ2P50tvRee5f8Ce7voQX6puxfv3f4Hc3VMGbMx+3Bxrx9T1/im9fvoRA2QN4qPAqQgX3Y3lJIeqqlyPe9jz+8vCzOD+6FA/MX4ri4tVYMa8aNeVLkR86hH899FX8vMOHLUsexJKCYsyfV4ei/HLUlRbj+Mm/w1dOPY9Lo6vw+OZHMT+/DBvLEnj2gz/DNy7sRiTnHjxVFUCTbwXumJeD3Iq1uMvTiH/68K/w7Ysfwix8EL+yahkCZgQdQ30oKV+NFYXZME0T46N9GPcUoLa8BtU1C3DxxNfw5ZM/xZXhRfj0ljuRPW6iqrYGnqFGeMoeQW7b1/FXh7+D3aMb8ddPfQ5VARNGdAAnRnPx1KJqBIsWY2upgf1H/gl/ceoHuNBXis3LN6G2IIjyihqcO/G/8OWTL6IpVIdf2bQJ2WEDVfOrkVuwHGuy2vCDg1/F10/vxaDxAH5720oEABiF87Cm/138+dGfIhrYihX+doRybseKsiIEi5diW1kA+47/M/7y9E/QGr8Tv3PPp1FXlIV4pA8DYzHUzL8TRQETMGPoGxlGTkE1agty4eHUJl6uimqLqlbJ6pAM3w5/VW1TfcM6tS7JgVLbeTR27Jf1HqsOFHup3zLz3lG/dVTZYxefar9MDmWNN1xQfeNmbFttY+Wya+nCp+yVbm7zvpygxLpqb3myZO9k6xR8qw2U/ebhuxXbOvpY39uZC0X+kM2FKnxV/RXZr4pP9u/wUC9GsipQNy8XKTLVnMvqRcVnZbO1RcbfiqMCu3VO9C7tdRtAsKAY1YVJnNq/FzsPn0V/cAkeefBO1OZ7Hfc5nk9ltUX0juoviv9YfVS81PheFFTXoCrehjff3YOD59qRXbcZT9yxZPJ3jMnoU2AnV2X2sni8mkONF1UvEdUOWbyQfGtOgFYCUd9TG43svcw4J7xU7yl8B8ODKP5a8eRzUVYR+v9nv21/OaWhNiSnMgB+M9XVS6ewUIBkSzKBaDQBr98PA1E0nXsNb3QY+PQ9n8HiAj9Hj1E0NLUit6wWVQW5k7bbku2Qxk2fuClftr+AO/5yk5cMKLWQWod09ZXhOB1UKGuZ8D21FjiF2ZJb1H3LhL/cjAmKjk5luBWP1B5Pla9a08F32k9F792sw+maJXRxRDSkQXeGerab8u3kgwjs1BWd8wFF50zkA4+XTIauHeyabt6kK0/d2l+qHW7xsltX7fiR+tnKizr7ZaIW6fBn11N/+wD5j1SJkkQkROYcUfGQKSwauCmFnyJDJ/kpmyGyX9ePPF48e0VFUpYMVhpdv7A2OaER0es0OtYWZdOID+PC+bfxestuNCWzUO1Zg4fXfwLVuTd/tH2qjrmoW7qKa5fIRqtcyv46AWqT5K3p7L1MDnV/KSDLE9M0lfaK4oFaSFW1kF2T5btKhghkdYKNKzfjTvY+lXsiOdTGQ4kVJwcvu/Ved0+oeUfdN6e1kwJ2fMrrO+yzNb9E8aCS4cZ70ZooR0TAiyHeUCjjST0sOe2nFF5OawFbP3XmEB69CEcXqLR2/cibu3TrXYpOd4a2M3NTdOHRqOqwbL9V+c7zJbU+82qnHT/yeKloefaL1mT1TzV/UHShHuCd9gqdWUKnvuuASha1z+rKksWddf8pfpXtu51aJLPfrt9TND5ZoFqTR2fd+k62bjWCR8NzgvUQIGtIrKE8O91YZ0G0WSl8J35g5dhZVxUkO/HA05lCnwJZoeclkKyoy3xnmiYMXz6Wr3wc/3nxVoRNL3IDJSjLKYDfY8I09eJBphPPn7J11n6Zv6y07GdePFk/q/aTRysqOKpBUDU48GwXveP5QdUYeLlqt07J4sEOf57OVJ14uLJ1Kk0KKPnN2ktdp+y3rH6oYsPOOmW/efsl0snOup1+oLsuy29qvdbNb4pOlPyQ4erkst38Z+0zzemXkSKdRX4W2WwFJ3bq+llEw9tPazzwZMr2m5WZif12g6db+U+prencb9ne8PbQyX7zQLb3urXArVwW0ciAhyuzya4drG95fhbRp8Cuv+3st2qdsl+8eijaT514EO2BjL9dP1jBTk3ircveqXRK1fEpfExCpPOKh5v4rLI8XqpCS8HlJQX7nlJwUu+GIkPT/gnAwJ8MCOkptlN8R/Wvyk9UO1O6UeSrijtVH1U8UOzRwbG7rrJNppMM7NDo8hDZCUz3u4hG5itRHOnYprMvIv0pdBRbKXR2983N+id6R8l1nt/czB2RbSnbdWq72/rwQKeO64LT+LKzLzxf8/qflQeLr6uvjN4JOM1rJ7khkyXypw7fFK1Ojab0Tuv7TMrm4eoCte7p5qzdeABoF4a6cw+1/unmP0/fTEC6ZplM9sEUUOl0Z0SZDdS5RzYHudkH7YKqH7mhm04fpNZBHb4UG+zEgy5QeU+5AKAUbzeEZhKcBLmKlvc7AFIXAOnWNYUP2N+vdINO89WhseICmW1qTg4EmS64upDOXNGloRws0uX7mYBM5Iqmq6mrAAAgAElEQVRdWgq+0wFDV55bcuyCnf3SwXVqkx163Xycqf6T7lyh4Ls9xGUqhmfrzJCJodgqR/XODp/ZArw9dtJrVbKc1DhWTzd1cwqzPVfs4Gban274MN2zwK3O3wlM+T8UDGP6jwhY/1aB9UZHh46KZwdEN3kqXCoND+zaY2fj7QQj77MMV4THe8+7LZUBi6NjDxuvlKFQF1gaHXks6NqmArdjUzTgU3CtlyK6NBRcEVBrFFub3OKbSXDroGGHlwqft+6kNunkMrVu26l9IrBT23TAaf7r5DIlJkT7KztUUEG3z1BymTf06uhEjXe3ZgYdcFKbZHumkpcuGuvQq1v3dcGNOqWiyYS/ZMDbYye91k6d4dHwdFLlpRv1RQZ2ZKvo3Zyx7eplB1cETmKTUm/c6LV2cCk0svnfDRo7/J0AK88jWmCLsirQWRoZjoyGIocCbslhaSgJ7YY9un6zQ8PbV3awlt1IiZopNVZkz+mg0R0CZTS/DPboxrFdGtmzCNiBkZILOrrxYt+OPVTQbZKyvOTRUL9ds2NPuuqZjAd1cBTROP3WKVO57Fb+qw4AM2mPas5QHdp4fTlTuWwnjnng1B6RLrJnKo3OZZJVR6ocN2PfDR9QYCbt0flSyy5OunLZLXvcqs8y2XZyWZcmk33Zrhw79ujoNtMztgyoF1DpymW36xlrj8eKzBqRepd6n/psTR7rGmu47HaQx9fKU2SYlYanN8Uenj6svtbNScmlfuuj8iPvHWsjq6/omwbW/6wuKh4im0X68/ZMpLtMF5aHbGAQfebxEekiiil2jYfH84EsnkR8WRDFuuhZFhe8/ZHZyeJYddHJZZmdLE8eyBqGKgZkdKxvRbVKxIvnA54uPBoRvqp+ieJQlJcy3UT2WJ9F9Zelse4hzwZWF95nSnyxfGU8WR6y2GZpRD7j6WKlFcUxL55UfCm1lpVvxbHyl+nF4yGKXyuerHdQY4eniyrf7fQBwzC4/ufxldnOi0EeL5avbL9UdVlUN0X5INofijzV3MH6QKSj6rKCZydPN+t7nj28GJTx4MlT1WPWZtHe8XKZIlekq0g3loY3g1JqHU+2bE9Eclk6kW4yGhEPqz0p4O2FrAZQ9kcWbyK+rD0iHB5f1kcqX4hiicdH5mtVnspqpMgmVT2g+F6Eo6odonosq0OUc55snRdvPHpWX5GfRLHOk8GbO1T7TO0DInum/RJAWfCIDBeBal0kzy7IEteOPSr9nf4OAB15FF+mA9yUywas7MIlHTLtrFNx3YxjHXDLV5nWn6o3tYao8plqn91aZxdfRy8Wz87eu11H3Iw/N+MBcK+nuKGXm/ZlGij+dFpH01X/qeBk/3TnBrdjwUmNtIMDZLbPpTP+VLFI5eMEz2lvsovH4osOHE73Wicf7NQGu3pmondRaoPdeMx076XyAuRziu4zRaaT2qDTe+zY5wTsxLbO2crDEhuG3r8fsirJ3jZQgCfPLrC8RM4Tycv00KFzOLGjm539cEOuSAcrL9meuLkPvHgQrevw4q1R88RNoBQrKh+3D4a6OvCAohObRzxaUW2gyhMNHSqdVED1u526LNOLvR22u08i36vAqTwVjs7li1N5FLzUgK3SJ5MXcLzPqWe2blPsowIPl83VdNRKETgdIKl5KfuCQmavG7XGSR3VjQUWnNaGdMafKhZlurlZG3QOHU7jQdQn3egvdvTR2Y9UbXAak1ZeMhCtW+cbp7XBbjy6VSd1D5eyd5Q5RfdZJd9pbdA5e6jsc7uHU2uDSB/2mV3ziZhSbkTYwqHaSLduoak0duTL6JV6JE10dXVp0czBHMzBHMzBHMzBHMzBHMzBHMwBDbxeL8rLy13j5/QAr3v5S5VPPePyaGSyfSwyi0i5CKCsq5TVwaHS2PlRErs6AIDhMVBRUeHYTzJw48dp3PyRGbd0yrQOMwG6OrmBD7j3o5N2dJyJeNTVMROQib0HxPXaaW2j6KDCT9cFsI7MTNSJX8TaxUImbHRj5nCikxvgtp/SAW7njKr26K6L3mVy3S0eOvzT0dcyHY+qvZwNsXArzq9u1E8VOI3HTEAqXmTrTvzkxgyts87DsxuPVp4iP3msDKxIqc8qB/DWVZvCo5fRivipaFM2WXVU6WbFocpl6Sn4PF/z1nk2yXRibbQWUtk7mQyKX1kdrLTUosDqaJVh/ZvHk6KDlZ/MPlYe5Z2KltWJAjKbdOhF+vFkqEBkkywWKDnHyrD6UFSbrOsUHSn4OvWHAiJ+MptYna3P1Nojoqfop+Kv8pdMBzu+tKOjiIdu3bCjiypPVfHoZO/s9CwqsDkpk0GxyWks2B02qbEgkkvln+Ip6jusDpRYkOmnW8NVOqn8JOLLw5ftt9N9pPCgrFP7lGgmoPYV0dxKmaGpvVvWd9h3vFmOxdedkaw6yt6JYkVFL9LFum433nTjm+cHqgw2b6lzk2qfqHO3bF915k/KHGZHB+p7EY7KBpHvrPQ6e0HVVxYrlBzSWbfKYPE81kXeAKkqSrrFWzW8y24yWHpVoqb4ywZjnhye7SodefpZdRDJEPFT6WDFUyW7aN3uEJai1d072Tvee5HfZAVe5UtdHXnNilrcnRSOdOHpxIKoMbFrPNmi+FbpyOasKl904lpmO++zzmAms4XViZKzImBtU+2LilZkm92LBhXYGb5UdZ7Czy25OrGg8qfdGKDqR3lv1UX2LOOhE4MifqpaSdHPuibT361YkB0weEMkS0M52OjoR41Ntv7wBmDV4Y+nj05fFK1Z9VMBRT+deq0r1/pZZpNoBhQ9p97ZmVVEeLLex5Ol0jn1joqX4inTj8VR4cpk6NRWp3jU+BfR8uYd2WeZXlRdZBcNlPiU6aBDx8OT7R01dyjveLGrk3dU0OWnM6NS+MnyzsMWfSsRryHwmqsOnnVN1BRlOqn0E8kS0fNk8T6LdBIB6wuWlx1ZMj4yHWT+s/pIpJMbPuPpxPtbFEs8PF6cOYkfXd3dlKvSyQrUPWBB5TPRGsBv4nbsUNkvikceb5U/WT119WNtZP2g2gPRs0wvHd4yO1VyVPtN1UO2p+nEA8SXIU7yVEcnXn+h7DfV5zp74NR+ts7y6i77WaS7Tl3m6cCTxxtUqfpR9lTET2Qjj0a1xtooix8KP5H9LG9V3LH2qmyn8KPGLYWf1W88HjL9VLaI8HR159nPvlPp4NRnspyj+M+6Ru3Doryk7ClvjdJfWXrKflufdfixOqnkyvZAtI8iPjKdZPxEetjxOSW+KfaqdGf1SVceUOORp58dnXiXstT4ccNG0f6l/vaJboFVt6tWPNHtFZtAooFN5CzebQ+rn0xXiiwrP1HCs/J4slig3ORReLAbzdPFyk91ky57VsWC7PZN5DNRMvD4iuJHpC/Pf1QdKberbDFi+bKxLdNDVAx4PFV6y24zRT5j6VT2y/wsy02rHDaXKHErsp/na1kei/aNh2flxSucVnz2meXH2iTLXXa/Vfx4dvCAUutkNDwc3sGFxZX1ClV94MW+ih9bW2T8ZH2IlcX7LKsdbN+QgUiuSI5q70T8RPEo4iHiK4pjnfolyguRz0X6qfoHG2e6ucnazdpljTFqbvLslcUMJTZFdUpUb2W+sPpPxENVGyi+EOWmyHZZ/VPVSkoesnml4i+i5+knsklWY0SxrYoRXq2k1DZRLeDpJPOFTHfes2iuYYEyq4l6v07+qPzMPovyT1b3eL6WxR/vnUx3ma5s7eT1TVkP5smm9D9qLxfZIdtzGS+VHqI5TvQs2gtVTFo/y3KTxaPkjqyOquqKlY9hGNP/FwCdZOYJ4g0asuFDd10GvABV8VLxpRR/KogSSMSXajdLTymeLMgCUwdYGykDDk8X67DFS15Z0qj0Fw08PBqd/VLh6MYmBVT8eesyGVT9KLqqcHkFTSWXUmxVsSfjpfKNk/zlNTJVPDnZD93YVoFOoxbpztLJ9pDSiyg+lsnViT2VTbr7zdLIDjG8ummnV/N0FfmAGluUw5eO33jrVH682FHNJzx6mTxqzuj2QVn/Fg2ydmJPtUeiQ4MsP93oB6wsndrC6iLDsVt3Kb2BKpfHi9q/ZTJkvCjr1Pyl7r1oP0X8RQdMSuxQ9FftkQpU+0fVJ4VP8RuFJ+UCQ/ReFrsUvSh9TqdW6M57Mr1l/qPmEoWnnfcqPAo/EQ51DyZ/CaD1bxGIbht4xYfKg0cvW3ciSzTIWO0QJYNOgqj0sOJSb8YoYLWFx99NWTx+VB9Z8VV7xAtinYIls19naNGVxXum7LeTPVLFnioeVLmkKsai3KToJQNKPPEuhihAzQ+eLjK7eLxYWXZyjqoLNbbtxgMVrP6g1modv/BqtPWzKh7sDmi6vHjrOoMtS0/pMzx/yPov2wdlsnhDnw7warjdPinSi1d/nMSDDGS9hSpLdsHDO0Dp9CarD0V9V6aXyociW+zUEN0azqOnHBJTdqlqk45cEejmtx3+bspysz/z8lfUH3m4lFqk28dVuHZ46Bwk3dgjGS4112U12E7dYu2invd0483N2cQJqGxJx0xF4UeNLY/otoXClHJDoTrQue0QVg9KYFHs0jnUss86jVoXnBZqJ/7n+Y0S8NZ40ymaPDydBLMriwoq/naLo1s6qZqO3TUqjewywilQ9pbnf7dzUxbbLJ7Kfif6UA+IMvvd9odMHzdl8fhRa5OInwqcHHTc4MfLbZ4/RPtBqU12wc6cIDsE8EC3lqrmEKf269YVp/7XubxU1SaWH3VuEsmi0KlqUzqAWpt01kT4TmzRmanYzyJ8FchicSZqk0o+Nd/snmFk8mdjbaLmH2VfdGqz03meB7La4PaM5AY42VunoBsrHrebPuUQJFqnyFfR6wZgpu1X4atAddtmT34S8URigrdpIpFIIilwhe7QnM4LD4o85/Kj6OvvwUg4CqfRwR5C3DxgcNdNE8lkEsmke/KdfrNjpXdiv9MhxKl8XTyn8qkw0/JlkO7a4IZ8uz3AqS1OfTOb5Ltx4EiH/HTlhhu1zE37dYEq32kNlK3fCvJ5uBT+1KHf7rd5mZRPiU3VjEqhcyKf5Zmp2sTj7UafpV6UUv3npnwruH2Y1ZVPAac66tK7ff5V8dc9f3t0kHXBbWfxcHhrTg4pMwk6N3vs50Q8ikTSprxoN/adP4/+WByI9GNvwwXUD4WV8p2A/t704vjJ99ER4cmPoOXSbjSMRJUydOQmosM4d/an+PLb/x/+ZtcPcfr6WPpiqv8svn++EXyvi/0eG76Kty6cROd4bPpifBSnms7gRN+okg8Vpty8mknEYzEkEillRnDi6lmc7p+QJ8tfyo2v7LJCNiBS6obugMlenvBA1pzSefhM0eoMzhR7KDLTCXaGRaeQruHGzuW2m/KdQDr6eDrkqkCVm25d/uhekuuus+C0blAvf+x+m6c6kIro7Q7LFP5O6J2CHf9qXdwnYxjq6cDpU0dxsnUErKk68lN9hSwbU/dP52KRN7/rxo6VnoevO3eIdOTR8eJ24l0CIz2tOLT/Q7z9/h7sOdWAvvHENHoK8Oxh5evQ6wIvt3Xk24cYepsvYOeuPXj7gwM4Wt+JsZjmgQf68eM26F4suj13sDKmXABQFNIBVSNIBQ+b8E4DinLIoOibabAvP4xLJ76CHVf77MmL9ODApQs3LwCazqF+ZHxaAeYVZLugb2s3Dh95Cy3cE7IH2fllyPVNDWeeDB25bWdewqsNHty14UlsLfVgx4f/P3vvHSbHVSZ6/6o6d09PzknSjHLOshUsR5xwwAZM9gK7ZuFyWb5lWWDZAMtyFwO7LLBewGZZg3HAOSdsSZYsS7JyTqMcRqOZ0eTO3fX9MWqpVFPhVHXPSNyr93ns7jr1njedN51TNeoH2NKV35g4Bx2b+dmWvcRN5uqtR7K7hae3reX4QGLohGQ/m45sZeOZfku5nDStqYFWXlj7NMtO9ZxFclMcLKTI6zacY+eQy2n85po3RO7r5TLtp914ySX/SJLxa71G93LdqF2sRlmEt1GtMbrORZZ8zc9F3+GE4dBdby3UdT+XJz0j3Tfkyn+k+YnMtRsrw7Ghzmf850smEcg3bb2nvmbrc/D91/j9y+/w5op3WHWoJyfeZnVFZG4u85zyHsn4N3oif349FKJnWnl35XpOxP2Ul4UZOLaFFev20pXITV6t3BcDcvEPccjQdWArL7/bglRYSnlBhgMb1rDmQCcpixJu1QfowaVUh4fbN4b8CoAWzJ4q5TpudG20QMMpixHYeaomxlMhk04STUSIKWnccoCgN4BHlkBRyGQSRBIR4oqCRw4S8vlxSUA6TndKokBO0Z+MksFD0FuA3wXxZDdHTqxiR+ZuFjaECfu8ZBJRMrKHTDJCSvYS9AaQlRTReD9RJY1L8hPyBQf5GsBgI5YhmYgwkIqRxkPIE8LncUE6Tk9KIiQl6E9D0BvE65JBpX8mFaM/ESEJuOUQYZ8XWZJQMiliiQjRTBIkHyFPAK/bhQQoSppEIko0HSeNm6CnAL9n8B5AJh2nLzpAQpHwucOEvG5Q3JSUN6F4XECGZCKJIsukUxGimTQuOUDI68clS0gopFNxBhIRkrgIugNIgNvtxi2rDxC62bV3D4uv/z5XV/qQM3G2xH/M6wdPMKu0bnDzHe9jIJNEwUPAG8LvcgEKZFJEEwNElDRuyX9ufSUJMukUseSg7i4pQMgbxOOSsk5CMjlAdzJGBg8hXxjf2XtKOkF/YoCEouCSAhT4BvXJQiYVpTsSIyN5CXpC+FwuHR/MkEwMMJBOoOClwFeAN8s7k6Qv3k8CztF3y2dPl5UU0USEaCaFLPkJeQN4ZBjoP87WE1soK5nFwsoQIbeP2pIqJJdHh99Zf3XLQIZEPILi8pNO9hNVMnjkEGG/79w6p5MR+pJR0sj4XCGCXg8SxpuJXMdzzRXa3JVv+k5o2KU9nDxz2dA5oa3dRGqbtFzX51KrRfnwf8jdb0XHjb6rZck3T7Pxi+Xnl6ovqvOZnfXMZy7KxS5mh0iXSs41wreyrR599Vj99Gv4+CQ4teF13nOLv5Z+qcTFSOciK1nMaFitBZk0bccP0OMbw3VXzaDcLRGtK+SNtS0cPT2K4rrgJaGnEf4lYfNkN9t2dVA9YxZLptTjJc2EwtX8dudhrmgqxeWRbecFUbgYuXgkbe7WImq/5wIigunx0yZvdbCJjGfBSHkj3lbGyuKIOrNanyx+JtHL9m2v8OyeZWxW2mhwX81tsz/EkuYm/HSxef3TPL//HbZLCcZ6lnLTgg9z1ahqvEdf4eo1CX5ad4anT75Na6ycK8bexxfmj2bT1gf52eGtHD31dVqjf8ffXTObPa//KzvKrsTbuoK2qqv57NxrGTj4Kn/Y+CqbpC7KpNlcO/0ebp86nqChAhkGuvbw9toneKVjC23SeG5t+BC3z7+C6tYXuHptmp/UtPJop4d7r/oMi6uKztsn1cPatY/w1KF3OShJNLiX8pGr7uGq6iAnDq/lpS0vsDLSQiYzjRvH382ds2dS6oWuU5t5ed1TrOjbTSdjuLbubu6cv4BRBZBK9bNrxwusPPUya6NxJhfcwZdv/hgNoQFWvfwvRK78R26tibLqnZc4EQyTaV/HK70HCcnz+OSVn+GaphqUeDvr1z3Fo4ff5oSngVsrlnAyLnHn3BuYVhVWrasMLj8SCrIEksvHuGkfxT1QgKJkiHRu4tHXH2dlZh9xxnBF/d3cu2gJZfIA+/e8w0s7XmV56ji10lxumv4Rbpo8ET9R9u9+nae3vcn6zDEqpIXcOuMurp04iUIgHjnIitUHePPkcrr6S1k87Rv8+YLxhDJ97N7xOo/veJGdSpTSzDxuu/KT3D6ublDUVCc7N/6BJ7pfo1UZyxWNH+Vj8+dTrVnO7pMbePr9p1jWt5eMNJE7p36e26ZNoEDpZdeO13ls54vsUuKUZ+Zx+8JP8cGxNUiZKIf3L+PpzS+zNnUSvzyPmybfzR1Tqnh5xd/wxPFWvD3v41N+zV82BfjNmrcIjLqJz46toPPoWl7Y+CLL+neTpIkbR93KTXOupq5ggLef/ntam28nfvxZ/hg5TZWymPtu+xKzSn0Q62D5qt/xdNt7tFHInOJbuOuKm5lcHhLKF2bxbCfOzcad5Bw7Oc3su5FMZpssK12NipDZeC452qjJEwU7m3sRfCsbDse4XXsM9xqZ2cxuM2kGVj5u1KRZxZYWx079t/Ihq/WxWgsn+Pn6bqS/CIj6lhVtq75JZC3sjhvRFwURGzrtIZ3MNbO5etwbDOOTJPp9btTPd0TWTuvndv1MZC2s7GEW/6I+Z+UHov2CXX2GxEsmRc+Zdny1Uyh3D25Ug6XllPuP0dXTR7o+hGsY4txIPzO9jepirnVeL8+J2lBRFDJ93Zx2eZhaXoZPlgA3RaNHUfzuPtrSGcZ4ZMu9mdO84KSem9UirV+L1KLsWL7qv/q720hQM+XNjG1FS/tdC3pGyFU+o4Uxk8lMN6MEZa1nhq72raw83M6Sq3/EP9QU0nVsJc/ufZ/q0loaet/gyUPwiZt+wXcrQnQdepv/2fgEBQVf4gog1ddCrPaz/Hjxl5C6t/HTFx9gw5Rfcc38v0Y+9R7b6x7iS3MagH72cIz97Yv42s33UxdykWj7Iz/deJBbr/kxf1tXRKpjC/+97FHeLvkmtxXrqkI62cf6LX+gxXs13//wP1JMK2+8+xyrD4zm9iAkB44QGHsfv7i6FI98od26DjzJs63lfPmOR2guUGg99BK/eW8NU2+cwHsHDtM0/evc11xNpH0Dv1u7jf0dTcwpz7Bh+ytEKu/hP26ZQSB1mmVrX2JTSxXVMyGZ7kbxjuOLdz7Mt2njhZe/ze/33cQ3Z3pUNgc4zv4TNXzqA9/j3nCK/Zse4Mc7d7JwVDndx9exvsvHn3/wEaYVuTi86yn+cUs3/UPWq5DJE0fzzPt/IDJmJgvGTKK8eBzTSoDEKd5e8QKJaX/Jr6eOwxU9yaqV/82Lh2byseLdrD5+hsVX/5C/rvJx5vCr/HrnJibXj6Fe2s+qXXuYfOU/8/XRlUTb1vP81tVsLhnFUiCe6CA86ov851VfQenYwA9f+TnbJv2cudENPNOS4nO3/4YxBXD6wLPcv3EL142tG/wbnmQHseqP8qNbv0SqewcPv/Uya0+M4s5a9Qs+nax89wn6mz/PL6ZPpiB2iCf++Cgryr7GjZ71PN2S4Qt3PkxjMENbyzP8YONmrhtXCx1beGnXPqbO+yf+prmS3tObePy9DRxquJ2P3PjfHHvrcSpmfJHPjauASKsqftpZsfppYpO/wC8njyOUPs3r7zzAK9vr+OSVtWSUIxzolvnLm37GFwMJdr37Xf5rbQv/dvNklKNv8mZsHj/62F8TlhOcOrSGQ9EYihLMKT/pxazRBlAvuWppijZvoptMs+9GINpgGW1gzJoBozxqJofoxsPO2hmthdkcURBpJvXk1VtTNZ7dZsNoXLRhs6ODGY6IDNr5IjJZyWG27qLNq1FNNtJHpIcxGxO5byS/mY9bNc12fcsIRzRvGfHONdbM7tlZIyP/EM3PRjgiOcWO/UQ3IU75qXGMNtB63602gVZ5S+9+PmqinbxjJpeefma1RY+2NlbV41q5tHRiyTiBsP88jseDX8rQlYyTBtTvahrFv9V3K98yys8i9rPLW8SX7dTsRDKJ5JHweM/3s1LATzjWT5/Ank5EPqtYFfFvkRqo5WFEy2iOGS2j2qLFV9+T9ZzZjgAi87X3RQu1COgFplGwGwW63nerxbRb/ADIpDjV1YavbC7za0pwu1xUNFzBLXOupj7k4viex6ic/HGmVxbiklyUNS5mcU0B+0+0owAe9xhmjqvD5wJv2VQWFW2jvduI2Wnqa6dSFxpML637nsQ9+k4WNZTikV0EKudw15R6trScIG1AIZno5GT7APOmLqYi6MYTqGby6Jl4Bo4TBTzeJpobz2/+z9slyv4D+5k2/Qaai7zg8lEz9oP82YIpeH0VLJp1Awsbq5AliXBFE+NLKpBSMWLxM3T1wZyJMyj0uvAEq1g87y4WNlYgA35vObPGzqTUJ4OvhskNM9nZe4ahS5GhvnEuowv94CqguWYWhxIpUqkox7oiFNfMY3xpCNnlY0ztdCqLS9H5C3oaptzD7ZOb8HTt5/HX/okHNx8a/Bv97v08kpjFPZOb8LvAU1DL1Ys/zvxyH+7CJm6cdz0zKgqQZA9lVVMoCJSQTibp6T5Eb2guS0dV4pWhqGoGN82/lXFFg2sULpzFnDHVeGXwVc7miuBGzvSBHB7PPVfdxOiwG2QPlWPmMD4TJ5r9XQL/eOaMqsUtyQRKJnFzo5vtR1sv/NWCvt2s7ZvMh6ZNodgr4S5sYv7Yeg63diKFJ/DxpTfRWOAG2UtV01zGp2NESNHecZyCknHMrq9GQaawaiYfXngtdQX+C2w1JK56d7M5OYfbpown7JWR/VUsmHYbpb1raI+CJB2hsWEpDQUecIUYN34pcl8bcUnC5QlC/CTtA0kUyUN181Lm1154SqUXq9prvUbIKFcY0dLy1GsCRDcHap52c6BZ3jKTwyz3Wc03yqMi/MxwRHlaNVdGcuYLzBo9Pbmtaotd26hxRG1hNd8Mx2jcrn/b4aG+r21inPifCBg1dkbrLRprdnsJs6bUynesaJvhOr0eSRDZRGjvi/ZqdvQSxTXrQ63kcFIPrCAXHbW+78RPnNpCO5ZrTrHCc+Iz2u/5jhO79ET2QHpzrL6LymGUQ0XmWPU1dvOaaK62whmJniMX/8yCVXxZzXfrBbneybuWmPaEVk8o9RztmFmSseKvvhbhbyZPLvyNwJCfohCPxkh4CvDKCooCkitAfZkfSUqxJ3qSuoIwkqKAJIEk4wuGiUW7SBaB5PLiOUdfQpaSMEhWw3/w0++Sz16n6Iu1UlcWOvevPiqKgr+wkuThNqImZKgAACAASURBVGIU6uqRVtrZcvwx/s9zKwi4ABRSqXo+OOvbLAUk2YNb115xemNuikPnn8wrio/ahlGgpIlF9/D4yu/x7JlNdCgJ+hKLuH/UHCYqERJpPyFvVm6JULicoKKAcgpJ8uPxqNZD9pJUMkP0Bw8ejwwM2liW3CRJQyrJsYEIZ8rK8HN2zV1uZJd3yNpJpElJQcY1LWJMQ4z5sTksf+PfeUD5Ov+7/AytLi8h6Ty+XDiWqUAmnSZ17F1+8fo3eTyym0wmRofrbuZOW0JoYICIpxqf66zNZC+VJedf1JdcXjyKggJIkowsJUAB2V+G/+hbfPPVB1mbOMkAcTpj93LneSdDRhpceMlDcaCAzvYLj3WU3nbe6bif1377y3P/8EeKSm6edS0ufxW+I2/y9Vce5P3kqbP0P8dHSBNLpfB6fHhc2VhxU1o5+KcHyajG79TfB3ro9lZS5D5/z+sBV2oX/bG7AQh43OdjRZZxkwFFwd1wE38bOMC7q3/Ar7vSjB1zC7fNmElFyKUbe2a5RY1jFOtqXKO5RrT18ojRWD75G9lAlL9IbhXVX/tdxP6iud2Kv5a+kQ5mttazrZa/EW0j/bWNoVUd0eOv5zMiuhk17Xb5q2mb6a8Fow2rFX8jPezon0/+ejCc+ptd26E9HPz1/F1L92LxV9M34i8S66K53cgn1XFvlOdHgr+Wnwh/LT/tHBH+2rl29B8u/to644S/Wf024392BInBeefocbbHAySB3Gq1/mp97eR2q1xm1//s8De3mYY/nN3nnP+lIyWjoEjyuX8zykx/LWhjzUg3re+IrJOe7lZzcuHvpK6rx4b8CYCZwbQJTu0EeoJkhVEvjJauET+tcbS0RPhrcfTmiIDRoonOUfPzBnx4BgZIKuA/+wdamUwGSXJR4K+idaAfhdBZp88Qjw3g9xfj0dC+kL+Ey7QouinwVdI6ECHD+Z9+iPd14glNxm/w43OyVMG8Ufdxz3X/yNwSWUVPQjlw2ER7HwW+NK3R1IVrlkox0L6J3699k7ppf8/LE+pw08lbq9dRBMhSAI8rTjSRAVyDdstkyCgK0rn3pIYmdGOQuGBbKsuUuiU6Y30kAD9AJo2ipM7PyNLu38ETmz18/KopeL1Bij2jmTd9MTsPnSBRX0plpoMIEFTZPZVKcubISh7fuoP5V/07f9VQhhQ5yINr9xMG3MEQwVQ/iTQEVX8ykZX0rACDG/lzoNCz+3G+tz3O125/ivtLfZBp4cE/bDX4CY8MA8kEQe+F/wigFC7j6rp/5aufuJtK14Vx1bXt13x3R4Zv3fkcPyrxoKT386sntgEufG43yVSClOoXV6RMhpQsI0kykqx6LUvNL1RIUbKVvjTnDgGSKYmMeyLqlweGxKAEiuyjrGoyd94yhTuTfex49wd8d42b/7x+tlCSNQMtP5HYNitgVjlMRB5tA3dBodNpOERlFOWf5W2Xtp5sdnC0cuo1a1YNnFGtMMq/Vs2yEX89e6hrkYi9RdZIPWalmxFtvftaO4rqr0fPrNbrgda3RHsCI3n15DerCUZ9g5X+RmusJ6OZ3xjFlmjDpqe/dsxKfzWOlf2N4t8qjkVyYj71V+tnN/7MelSRHtHMJ4zkseKvR9dMFyPaRvezvIz0Eq0ZZvSN8Mz452J/LR8r/UTyr0hdM5o3JLZkmXAozOHTXaTGh3ErCplolJ4UhIIFuDS1xC5Y+ZOd2MrFJ0T5W9HWs78/GMIdS9MXiUG5D4BMVxft4RIWyfp//69XG4z0N/rU6qKlZ6SLU98W8XUR/mb6a3HO7SFEGgzttZnh9AQxcgaRIqY3x4i/URLQm6PHX0Qfs2JkKLvspqakimTnRja09pDOKMR7W9l3ZB9dcYX6CZ+gdfeT7OzoJ62kOXN8LWtOdNNUWzFks3eh/F6KfQV0RgbOXg/Fqx13D7FDL7HuRBcpJUOsYysv7DzEtOZ6w9+C9HrLqCr1sn3fDnoTaZRMijMdx2k903/hZm+IwwcY3zyGbVuXcaQvCaRJ9B5gzf5WYqkYZQUVTK6qQFZStJ3YzY62k0QAn7eMkoIMG/ftoC+RJpOOcOz4Hg529Ku28Xrrp7a/sZ1wBxldVkxf6/sc7I6RScU52rqNw93t52Q/t36eIJ0tj7LsaAeJDEjJLvYf2oSnoBxPSTOfdm3h6T1HiKWBVJQT+9/ncH+cRCpDTXkT4ypKUNIRjh/dzuEzZ0gDxSWjKexfz6pjHSQViWSkkwOHttMWMfs9U4lIvIex1VMZVeQlHe/lQMs29g4MnLNJSeIY21o7SAPx3kOsODbA7MaKC9aIwsnM8+zgtf0niKQUJCVNe+tuTvZBJNbN+JppNBZ5SMV6ONCyjX3RCOCmoqyW3jMtbDnRBiik4+1sO3CA7mgSl9tH2BcmmU6Q5oKjFqTCScxyreeVXQfoT2Qg3s76Ha/SUXAlFQETdVGIndrKe0dPkc4oIMkUBkOcikZsbXBzaSC0c4yKiFHStZtbzPKoWaOYHRPhb4ZjNUdPflHZjHK72fqJ2MasYRKxvx6+Vf0ywtWTTVsH1M2hdlxPbiMwqzsiNjVaR5GmW0vPzLecbuL0Ghujuq2VX8vP6L7efDWeES8R/9Frpu3mKhEf0363avTsxI2RHka66OVGK131NiZ28qCV3Ga6Gd1zgms23w5NI/3txmQW9NZBbzOj3lho5+nxF4k/NZ6WrtV8q4M27TwrHxXNUeoxrf3NNo/aeUP4yS5KymtIntjLgc4oGSVF2+EW2mJQXhpG+1tNRvbXk1/PNmaxYTZfD6xqnB5/s3lqfxOJkXP6B0sYE0qzY89hehIZ0vEe9m5vQaoup9gtD+GhpWmWG7OgFy968eQ0N2nrv7Ymivi/CH+redpxt94kszEzsHP6ZgRmylg1OVbF12i+VfNj54ROT/7z9GWKy2dwZcMxXnrn2/zS1cm48G18cOISGt0u/GNu4u62p3jqzb9inytFlTKV6+Z8grkVPjhiqDXgYdTYj9K94vt8eWA+X1rw2SGye2sW8/mZXTyz/O94wN1DMNXMFZM+xg0NfqQBfcouTwEzp91Oz6ZX+efn7ue4VMniiru4fUaFLn7/oXWs7G3m1pkVlDZ/lA+2/Z4HXrqP4+4AU4pv5gNTl1BcOpamgk38+rXP0uap4ZqKRQQkiVQ6geyrYM7Um2ld/wR/+8xBej3TuW30HSyZ4BuSKI3tb3bXTf2o+cw79Qy/fvXznPLUc31oMn5vGIB43yl2bD1Bw7y5VPmbuGP+FJ5Z+c885j6GkqlhasHV3DVtNF6vixuW3sjv/vgrvrz9MCnPbG5puIZrGoOEq8dTdugRvv/8H+hzz+bWsiaCEkQyKYLhcSycuJ/n1vwzj69tpTZ0Mx+acBVVqn/cBB0fLR93DU3Ln+Mvn/w5Ps9MrmsYS1mynz6gABgbLiNw/G2+vfs1jiTrmFZ9B3/WWAucUVNh8RXX8+LW3/BXm/cQl+u5ruHj3DgLSsZfx5hlz/EXT/6EgGc21zU0U5boow8oL5/FLRM6eX79/+GR9Z0UB67hxrHX0+x2IbuKWVAV4Nfvf40vHv8iv1o4XrUOlSxdeAfPb36Yr+xoIU0FM4qv585p4wkRMVkjGU8wSHLLS3xj7SqOZ2TqmcH/WjRBKPYHeYvlLZHGLTsumiNE5LMjmxO99Pg6yV1mG36rubnSN6slTmWwo4uV7qIbbit+Tn3VKR0jXKsGCez5uFEdzIW/mfxm43ZwnPi4ndwwHLkjV/p6YDfn6eGZ8bWKD6uNvJncIiCyGbDqI0X8QRTs2M1pbhLZKFiBFW0j2XLNc056fyu6+VpTU9kkmfKGsUw5tZZ3nn+KNzMK7kAx0+deSWOJdyi6zfg1iz9L2QTuW0Eu/YUwuIJMmD2ZjpXreeR3W1EUhUBpA0sWjR786XELHnq2MYuFXPOa0SGsEb4d+k76Iu38C+ygiOzKL4MudMe6Kbm/5Nx1sb+Yrm90WcxSSCdj9MV66Msk8bmLKfaf/T12RSGditIT6yaSUfC4wpQGCwf/kb1UhFNxqAwFz7/CHzlF2ltN0A2kE3RHOolKXkoCJZDoIOkqJazaXCrpBL2RM/RlUrikECXBosHfZc8k6IklCfqDeEjRE0/g9QQIuGVQMsTjfXQn+kgobgq8JRT6fbjSQ+VJJyJE0l7CgUGe6WQ/XdEeooqE311MaTCAS1JIxgfojvcQV9yEfUV4lAyyx4fP7YZMimisl97kACkpQLG/mJDXjUSSvr5+vKESfGcZJhP99GR8lPtdxCK9KL5CAi6FWGyAlOwn5PEiSUAqxumEQnnAj0yWfy9xXMint/PE3lY+cOVHmVzsIh5L4QkEcMuQSScYiBzi7Q2bKKyfyeyGsRT5PWefrGeIDpyhKxVFkYIU+YsIedxIpInHe+mK95OSghR7QyhKBq/Xh9clo6QS9MW66UsncLsKKQmE8blkSA5wKiFTGQqcs2cscgrFW03AnSYe6aEjOYAkBSnyh1ASSXyhAlzpOJFkGjdpehI9JCU/hb5iCrweZCVNfyIGLj8FHhdKJk0s1k13MkoaD4X+Mgp8bmQM6BeEB//NiXScvmg3vekkLjk8KLNbRkIhlRygO9pDQi6mNuinLxFD0vDrSkZR8BD2lxH2uZHIEB04TcZbTfafiVDSUbrjEkVBPzIZkrE+OuN9JJHxu4soCQRxy84L1WW4DJfhMlyGy/D/CqTiEWJ4B/uny6XzIoJCOhlnIBInmVFweXyEgn48l/sZG5AhGYvSH02SQcLrDxD0ewz/9PkyiIGtAwC7ryvmerqUD3r5lkENzg4ALgS1fMMpaz4g19OniwFDbJoa4NjxFo7ETtGnpDl5YDdyxWLumr2AIo8xnf/XweyVzZHib4ffpearl7q9Ljbd4YA/JVkvQ/7gTzHWLvtqfuFPzZ6XirwiclwqsuqByOvelxJcan2KCPyp2PZPAS72+l/w/oTVWYD2dYV8vDygppGvlxFEDypE+dmRywjXSE8r+fL5gkau9LSv+lxq8unR08oLCsn0afa2beD9U3sJNV7DB6fPE9r8a2UTWWsrevn0/+Fcj+zam71qlk/5tHhWr0RpQc9XReble+1EE7yobfKRi9T37OoroocdeiJ4ovS0YPQ6pQjdfNeGfL9ol2usa303l9i0ki8ftrZDTxTy5at2+yE9ema+KjKe71j6U6eX3QSK0hORYzhjfST7wCxNIzms6ppe7R+u3OEUnPQndnjnS99sn5Ivek7qul284d5T6dUmUXqXal2306fmq66LyCcpg2D7b0/yBWoeduXIVT6787XNfD7eAMi3fCO5jqKbm+GWw4wfXLqnq5eSPfRksSPfxdBlpNd1OO2Rj9j9v8km+dDlYtjDCC7l+LoYdWMk67xdMMqTl4o/Xa5rufG71OUbabDjT/nqubWfZvQvZp4UoXcp+1O+YyPf9hhu210K/nQxarcovgz6//hSdlx7spLvT61genh2x0U/7c43e6KoHc/HpxP5RMf19FCUoU811WN6NESeslqNi8gmagM9+ZzKMRLyDSd9PR+1Wq982WQk88ZIfdqJR7vyGeHboSMa53rXeiBCw4lNrOjnamsjPiMd30Z5yIl8evPtymc0z4j2cNX/ka7zTuTT2upiyGFXPrNPLb7Zda5+pX0jIt/xZ3VtVz5RPYdLvpHIP0bXWX/K+rZdWk5l0YIZ/eGsu/mgdzHyU77k1943e5tJNPfYue8kl9nxbyf9f77lyzXf5FM+ba2X1TfNGKpf/dWOqwnrnebZxdfy0+OrJ5cevvZ0xOi+1lFE5xmBXbtox/X4W42b2Vk7nuWn5q39bqazmrYa38iGRrLo0dejZyWPqLxa0PMB0bU2W0Mnclnpr0fPSB/teurZV8vLSgetfzqNF5E4N7tvF99qjc3k1NNfay/1fTXYwRelL5rn1PIb+YI251vlBe2YqP9rdTCib0dn9adVvtDS0943ijMjEM0LavnMirVIrGnBLF8arYv6Uy2XFsdojpUs+eoLtLaw82k1T6uHaI2yum+WF0XqshG+dtxKTyM+eussUiOc6KClLVoLtGAVl3ZyoR49M5+wktMo/kTw9eQXoa/VwypfqmkZ+YKahyTpv45u5QuiNjPDF4lnvTgw+3TaZ+j5ulZ+Pbn0wCrP2a1RVvxFYsHIF9T3zcb06pkebb1xM/p249jIt8zwzfjoxbPdfkKEnlG9Fl1bNU09+laxo54nZTIZxWwhzUAExwrfLg3tXDBeeLs87Moi+icAdviDtT5O6A6H/k7AjEeu/J367EjonS/++ZR/JNfCrtxO+NulN5LxMxJ+l2suzVWWXOx0sXPZxeYvChebvyhcbP5qGEnfzmXuSMTPcPKH/PUuI51LReqVU1ojTWM4+eda1/MpSz74O+kZjXx9JOMylzER+kb3zTasTmjbheGq6/mmN5J9Si5+J5udmmQJGYFdw+rhq08lzHgZ0RORQVTOfDcsdouiqD5q/HziacHueoiAmSy52t+oKVFfG/ngSEEu/EULUS6yaPnlEptWvMzWy4lOVr6l1SHf8WPXt+0mfrNru/RE5g5H/Gd5OaVt1ghaQT5q2cWqJReDv95TBlGwaii118Pla1ay5IOGVWwOh2855SHC34k++e5d8p1LrXxZpF6Jwkj7Wz75a3sKbWw6qeuiPI0gF1/IR2zq6WzGN9c+xoq/dkNuxisf+yP1/ez3fOY0O7k/H3vOXEBkj2GHrxN9RPOxCMjageEoLFZg5FS5NnUXG8dpUz2SOGrQS3SXmrx2cHIp6sNh31wh1ybFru3Uhc6sqDrhpdf068W/CB1RWXJpqvIFTm3nJA+P1KbYiX2d5hojyHdjerFysFPId6yAfuMnSscMRBtqEciXfXNZS61tcs0zI11XtGC3zlyq9V8NWl/Od6zkgmMXhrOv1OM13H15Pg4sjEC71iO5n9GDfNhOrdNw8xqOuqIFo4NHp7zyQUMUxypXjtS+UgT0+Aw5ANBLjnYcIBdnsTpt1JNL9ITLjuPkeqpjRstMJ6vTV7tOYOck1OherrbTypKLL2nXW6Qhs8I1ui9iOxE+Rnyz41b6Wt0XhXzazo4PG9EyaiyseGnxzZ5aqXmJFFUzPmbXdnBFCoTIkzgr21mtt52cls/4NwPtOuWaK3KJnXzZzgpy8SU7dO3Ev5Xt7DQ5w91LiMS/CC0RGZ08Tcsl/s3kssrTFzN29HBF6r/dfs/Kh81oWdWw4Yr/fMa0GkRy53DEvxGukxpmBXb6f7s9bL5ix+r+SMZ/PnrYfKyRmo6d+NejLXoQbdfvzGxnhGtEx65cw7GH1eOrZzu3+mb20+hUQ49IFt9ort48vXt6ONoCb3TSLopnJpfR0w69ayNQFIXe3l4h3MtwGS7DZbgMl+EyXIbLcBkuw2W4DPZAlmXC4fAF+0gwfivLbA+bBas9rNk+1Wi++p4eLZF9qt29tRlk57jVF3YVs6O0FZ7eIYAT3mo6ZotmJXMW7BhYQsLj8QjhXobLcBkuw2W4DJfhMlyGy3AZLsNlsAeyPPgSu9N9ntHDZ7s0RPDMcETp27kngud2MilfYHXAYHZyYzSmhnzIb4uGBMFgUAjVzsGC2VsSFxNEXpXJZf2c4uZjntV8J3RHYv2Gy6b5XOtLwY+Hyy+c3B8J2+Qq76WG62R+PmL5T8m3R0Jf0Tl2+eaTbq65yw6tfMJI5IJc63I++eZj3qW0fnbgUshdVnMuhf4lV1/4U9bXyX2nuE7hUu2Ls+D0QbAdGOn6lwvIWcLqTzMB9L6bjZnR0gtONeg92dfOVxTzvxs2k1k7V1S/XO2k1kfEjtrTLVH+Rnh6fO2sZ3Zca2czuawCz8pmVrpn+ev5iNE8O7bX3tf6o4geRrRE/EXvnt58OwnCjm2M9NW7bxSrZrSs/Ecrk1V85hqr2vlGa2k038pfjZoMPdvlooco5BrLRjIZFUL1px6uWW424+Uk/tTzRPOQ1ZgVWOVWJ2Nm8mh9U9S2VrGsnm+VG43ksVOX9a7txqLdPkP9XUQ3M130+OvNsZLFDojkVhEaZuNWOUukBhjR1s4z42MUy3rzrUA0D+daY/TkMvNxu7Fs1K+Z8dXzQSvbW/G3GtOTRztHWzed5i7RXKDlb5abRGJdb/309DQCo/ki8WmEa5YfROuikT+ZzdHqYIYnGmMieU6N6zQ3m/E0ynMifa8df85F5ixc8I8AGgmovq/33YihVSI2M5yeHEbNl9FmWq/oGM3VymTEy0gOI7nNklSWv5nMRvPM+GoPDKz4GiUHo2IqupkXPbDQ8jKbZ6aTyH29MauEa0THaO1Ek4qVzNq5ev5rNV8U9Aq/9r7djV+uycysWJrJoo5rEX8xi38nfqWWX8QOWVyzOXZygtXaWfm7U38SiXO1fEYNlh5NUf3tyG7lT07sYNYk22n49Ro3u7Jpm2Wj+Xp53k7c6dneTvxr+evVJvW40abHTF8jOY1kM5PZqk/Rym4kp9E8oz5EtLm2WzdFGmE7ddesdxIFETs76RftgFk90OLpgZVf2pFPTUtrS6NYMqOllslu36weM8srZv2clZx2+n8tvkjuEo0lPV5Oekz1tVUtNuuF9dbfTAerPkgrp1HP5aRWWu0ZrOQwA7Oe2mzfqeahXQs92iI1TLueIj6kvjaTwagvtxNLZmsna5OBWUBrGRsxcto8GzmM3gZVLwlayW4lt505IrTAfiFyUhTM5ok6s5U8dhpOo3Ww4m+3STDib3QtOi8LImtnlizt2E5PFrv8ndpOHTu5+n+WhrZht5IxK4M2FvNtO6ONg9nBhxP+6msnOuRSmETl0qOdC/9cfEe7/nr+YCSLCNg9nMgniDRhRjGTz3h0KmMueUX02qx2GPUlZr1AvkBUB7MNu53aaXRtZ67RfbNNYi55V1QuO7XNru8Mh/xqPk5y70isqd61VTzkajsRW4j27EZ07Ky/9tqshhvxMTucy0UuLdg9WHMiV662E+nX1GC10XYCdmQ22sM66R304sGOXCI4Iv5o1QfkklvUPGU9ZfUMJOqIdsBuMJh9F+GVy+bSjv56zjgcILJZEZHFqU31QKQgiILdRJQPMCqkoknOTH8nsog07kayOIFckrm2KdejaVdeo7i1YxejcRFZsjrlI3eYgZ1YHgn+VjjDmddEYCTkza57PnKPk02gWgYnoJbfib2Go+aLgp26ZXZwcTHqRi44Wsjl0N5oXGuv4VpfM/uLbpRy8f18gNnBjtW8fNYMkV5Ai6+l40Qep3XIKH+IbniNZLGjgxP+wwn57IFFfTBX0PLP98F/PkC0Zx+JeiayZ8llD+sUT712ap7yEEwDofKx2RZJanoJKxfFtfzs4Gvn2k0+w+FoVqdXTu4NhwyihzsieHqnySMF2hM4p0XUqf2tfDbf9sj10MWunlYNitGJ9EgWHa0MIiD6pMOMp3auer5oPhruQ0i7+SjXfJ9rQ2sHsusucjBuNN8Ovoj/i9JSz81X7nEigxbPrDnRrq2V7xrlAvX4cOcJUX/U018vFrR4IvrbBdF8JJpfjPDt2j+fm4t8rbud2NPmfNFDjlxlEZ3jxJeseJptEHPhpxcvejY1qyfDsUk2W3erWmZn/6FHy649893zW/m0Xv7KhZ/edxEw6p1E7ZGPvsKsduUjb9vBM1s7WYtoBSJOa8RMZEzvNCeXzaPePbOAyldTmY8iO9KnbbluKOwmXxE8Lb9cN6hW86zu2SmIwyGLnaSWqy/btbVZUXd6GmoW47k2r3bn2bkn8qTB6KDUjJ+6QbIbO7mAyPqJ2Nwq31vRHO4i7rTZsHuwo8fP7mYpl7XNZ52zOpQU0VHbM2SvnR5C2o0rp/lNJB7V98zyndoGucS2HV3Mcq6If+W6wTTil+vmbbhrg1GTbYefaL9qF5zGTC7zszREN7lW/NRxYERDz+Yi+djpplwPXy2jUS3Ldf3txmE+D/W09M3m28lfdvg5iYXh7PFFaIr2MPmqw2Zgxm/IPwJoB5w2Z0Y07G54nTSD6gV2yi+fJ7d27+XrdMopvVzXwy5vK35OdLF7UCQyzyk/NeSL33BArqeZTnPDSMZqPvhp6el9V8+x4992+FnJKwL5zA1OaeeSO//Uc4OZ/PnMDfk8KFRfi24knayxVaNm916uh2n5zg1WYObfueaGXDffdmnmctBzqfAbjnlmYLURyxe9fOQGJ5tqkftG+TjffYNVrOaSG0R52AGntU8938k9PX6Xeo9v554TflrfuNR6NN2fAdQzuN6pvtHimNEzEtwsaM1ksMMDLnQovYUxo2Pn9Cwrmwg9Ebtb0VGUjDCu1gZKJkpbVzfJjALpBO09ffQnMpYya/Wzu/5qOaztlKS/v5t4Bh38DLFID7GMfXlMfU1JExlo4cUVT7KiZR/9ibQurqjOerjnbJAc4HQ0TsZCZjv66dn33GfmQn9RFIVMRnWdjtEdiZGx4GWkn1Vsoigk+4/x6ut/yy0PfoIHd58Yopf62mmuGWKDs3qew8sk6YtGSGYyhs2KiO/rzbErs0ihE83NdmLRih4MbYyMbGJXLyd+LYqjfYrglI6efnZ8RZSndsyqeRbNs1Y4VmsrSs/MZ42etOVjbXOhIyqP3lrY5Wm0tmYbdjM6VvLp6erUn8ziQkRmKzqicujh6OUeK3oi+UxULtHYzod+WTCt7UqGVDLOQH8f/fE0iuLcv+3YKd82NJqjB3pPjLV6ific2bgRPet9hEI6Gaevt4cz3T309EdJZobmA7UuucabET27dJzgqK9z3SOeH8+QjEXo6enlTHcvfdEEaZ24t5NXnMij/bQzH8zjVkRmPX/MRT85K5Tep9GYkQBZ5dSf6rlqwbQ46vt6TxS0uNlxNQ+9JGlETwsi8jg5OTZ72mBkJ6N5xvTSnD72DvvPRC/A0dpb7xNAGmjhoT++zpFYHPqP8J/vqIRtAAAAIABJREFUvcKKtp4hfLVrq7a/GQ8jHCPd9ent5+FH/okNvXp2iLN/y/Ps6Ek4lkcPuo69x29eeohnW5/hwTU/4+HVK2mLnQ98I99XX+sFpW4sHXqGDzy3jD4d+5j5iN49K3srSpKTh17noNqWvQd5/dBJkll6A7t5esNuYgYyi6+bkY0Vjp18l52xuTz46ce4b1KdoX30YlNkbXXpxTtZc6iFzkRq8DrRxttbNnIiEtO1tx5/Pd8/p5VBztDLVVayG+U8PRvoyWeGIwLaXCjij2b66NEUtbcVPSscM15WuuvpaWRLkZojes9IZvU9PZ5GuUaEntHaanOeVS4145XFNZIzl1wjcs9ozUX92mzcDEc/Fxs3ikafZrEt2gPZ4WklTy442nGtPup7Rv2Mnk20tK3iX8RHnKyJHojkLDVu9r8LN0TG87uP72bViuU8/PCDPLy21ZS31i52c7vRuuUjt4v236J5xAzsxq0VnfM4CqloD9vXLOexp57nkSef4/fPv8m6/e3EM7nXEat1A/PcbrYWVutvtbZ6MpvRM8aBWNcJVr3xGr87a8PHX13N3tMRtN6gp7sRTyv+ZjLr9XQiehnZWyRXGNnbaI4RHfXnkH8E0GqDqxcYZnhmY1plRAxhJp/Z/CxYzTe7thpX3zOyj1GBtrpvVgQhxr4t9/PW4U7LjaYVmFlPJFjsHJCI2EeHgw6NANMW3su8Ur8wb2vZouzY8DKBqX/FLz76Bx6561vUdL/Icwe7DddW6396CcKwiTmnnnWB1/IU1ylLL8KOdd9i1SnVzVMr+da6HUSyuIWz+POrZhFUoYisrdEh3lAaComEhKeombLA+Xu5FHMh3+s9yAPr3mFfZPCwDH89d165hNEFwXM0zNbW7gFgdm6Wtqh99HzMTu5yClYNiRP7qPH19LNjHz2aWtpG+GbNm2gDIO7f+nQtDwJN7CMqrxG+U3rq+aL11awB0pPJ6L5dcJorRfXLhxzq+3Z1tOqP/m8BJz4qQs9JXsmCXd+w6pHtyiHac8cG+kkEymksK0KWzfOVUz+0ApENkHpM776oD+jVFyNZ8hXfRrIMASVDx7EWdra6WHrnR/nyn3+Su2aXc3jnNo51J0xtoUvOxv5AD8eqPtkBJ7FkNUe3B0xH2LdpJ8cDzXz63k/z5XvvZHFZH6u2HCaRvtC/c9XPKh5E+xO74HR/q+2R7erv+s53vvMd0QlWp/oiDK0glwStvS96GiUKWnqxVIz7V99/7trv9vPNxd+0kE+h9+RGHl1+P9/b+CCbj8s0lI+jPOACJU1X61p+89Z3uX/T4+xsDTKxbhxhD3BqNV/ZfIaJA8v4l2Xf4+FduygKz6A5GGHlpp/zg63P81bbZg72NzJ7TCWH1v6BPSmZ9av+nRfb4zRXjMcbbeHJN7/D9zf8hncORRhTNYmKgBsSp1nZ0s7U8RMpy/Sy4lgrdZVjGVfoR0r1s3v7o/xgxfd4aOc+wt4pNJUFkVtX8ZXNXYzqfIF/eG8dxeUTaAj5L7BP15E/8u9vfof/2PI829qKmdnYSNAlk+49xKvv/gffW/szXtzXTnlwLLXFQWRAiXWwduOv+cGqH/I/u3bgdU+hqbwAF+28v/59vCXFvPbuP/GDTa/RHZvIzLoyZCJsXf0IR0OTqAtG2Lr5PY4nB9i09qf847rfsK7Vx4TKRop8biRSnG75I//29j/ynzvW4k5UcvD0Cby+Yor8bpX8vWzauImJV95Oox9kbyFlfonORDmTKwuAKOve+jH/tObf+MOeXbi8ExlfGkaWJOLt2/jDsh/yDxsfZP2ROFWFTVQW+JBQiHTs5tl3fsh31/8n7x6MUls+ieqgGzq38oujsEBezw+Wf4/Htu+ivHQhowvdg+LE23j+ze/ynfcfYuXRDOOrminxe5CIcmTXs/xo2Xd5YMdquqPVNFfUEHAB6RiH9z7Hvy37Dj/ZuhavPIPxRX28tuaH/HD3Wyw7tZuOVCNVvU/z7TX/xbttqzjY1cvo4jlUp7by4NpTTBpdQ/LQS/xmf4rSjpf57vIf8/u9R6ksmsSowrMHLtFW3n7nB/z9ugfZ1h6kvHcHm3pLGVdWQLr3MG+8+1P+fu1PeLulg6LAeOqLA3Rt/yWfXv0zVp16i9dOe1lSN5ESV4KDe1/kP5Z/j59ufZ1IdDxja8rxSXBm20M8cjRA554f88DeTqbXjsMVOczzf/xnvrfh17zR0kZj5Wyqgy4AMuleVrz5L3x33c95es9+CgpmUKu08N/L/ze/PbaSDSeW4/Z+kBnh0zz7/hb8JZWU+LxIiTOs3/A/fH/Vv/Lonj343GNpLCvErSTZuusNXj7ZR+feh/jWmp+xqS1AU3kzJb7z56gimwzz/GBcePKZW41yo1P5tSfiIjKY0Xeir0jznq/6YnVQkiv9iwUi8uVS/0dC/1yatIttfyswOjTKxwY3F7ATr/nIZcMJTmPbLr3hgnB5PWMbawl0H+aoq45ZDUXYYS+ySRONf6M3Lozm5MJbPV90De2ujW35MimO7d9CR3gKCyeW45ZchEJ+Th8/RTJQRm1Z8IKnsE7sZ0e+fPuhXfmsQLeHGDjNmn2djJs6lTGlAWS3n9Jwio2bOhgzuYECt1j/lQ8Ybv+xwrG7vlbyDTkA0AOj5s6usUWNJVLARWgN1ylNFuwcAAzKC9GOHTy88lVcYz7JVxbcTVNsPyv27aG0agq++Dp+9dLzNE7/X9y34A7G9K7hwS1HGD9mEsVdG/na+mWMDizk40s+yfWhGL9e/gb1U69jRvV4yk6vpmbsj/jq/OmUuNLs3/wIzx1Ms/TKe7mxeQJF8kF+88zPSY2+jy8vvpsF8jEeWLmGUWPnUKG06x4AjC+Q2Ln9EZ5ryfDhq77KXaMq2bbhKdr9s2hKbuZrG5azoOYOPrZgEc2FYdzy+SfZqfZ3+P7r77Jk0d/w+RnXUn36VR7cG+CaeomX17xBT+FSvrDw48z39fD6tk0UVUyiyhdnw6bHWNFZzZ8t/SK319eyffMzHJfGMqE8xoqVL3LQ28RdV36Oe5pHsW31v3Co4HamlaXYtf45umuuYnw4zq4db/Dy9m1MmfMX3Dt9EcETT/LCyUIWjm4gcnI1v123kSmzvsjnpy8icfwVHtxxkplN06kLq98g8BNpfZ3VvQ00lfjxutwUFI9mXFkYFzF2vP0dfhtdwjeu/3NurCxn/XtPM1C1gPrkXn63Zh0lzR/hi3NvY1xsG2/tP0x9zRSCiWM8s/wR2io/wlcXfYqZ8mlWbFuFr3I21ZHt/MuOd5lRdSt/tvDjXOPv5oFVqxg76QrKlFaee/Hv2F3yBf7m6ruZEt/CLzd3cvXEsfQeXs6z+zq5fuGX+cTEK3G37+NwXKa2tJTWlif47cbjXL/oa3xu6kxa1v4Xez1L+cDUmRQdfYnxcx7nvqmNVJVNY7FX4tmBD/DQrffQHA7iGtjOI1ujLJ3WTOboW/xu8zKSxbfx2SV3sVg6xL+u3MaVM+dRmOlixcqHeDe1mG/ecC/TXd28uv5BjviXcFWNi1Wbl3HUu4C/XPwZllYUsv/AVlIFzTTWTWKC20849CH+/uobqPN7ObjrUR7d1cvNi7/MpyYv5NSOR3its5CZdbVE9vyOn+2PsGj6p7l7+gxKPTGWv/YTupvu40tXfJgrfL08uXo1dePnUCZH2PD6t3nBdTt/e+2fcUNZmJXvPoXcdBs3VI1iQ2cDX7nuq9zcUIkndYrXtrZQ39hMhdzL2+/9lvf6x/DZpfdxY2UJKze+SqunngklQfbseZoH9p7hxkkf4hOzbiN4YgWvn+xnYuM4gpJ+PspX82eHxnDmRqPcnI+8bvT6aD4PP3It4Fp6ZqCn73BuBoaLtlqPkZTf6UZe5CBKj99wgJ5Ow/n0aLjXJh+bYzsHBXZpi4IZ7eHuG4cD9N6c6Tm6m4OyvQMAoxqmvp/1AyN8K3p6oKVnVWdEDwJE+eUKRnukTDrJ4f1bSdfOYEK5b5CnO0Pn4RP0ecM0Vhfj0qEjqoeeDEbXTsGojtmVzw4/da6JdZ9iT2cfjY1NlAUHH4jJ/jRHVrfgmzmWKo/LgqI+jyzkooOdPkAE30mNNaIvQmfInwDoEdYjKhpgatBrvozwRA1lVwbRV4Dy+arQuYVQUpzobMFfNJs7pk6hrqiWmdNuYcaoCSTjUU6sf4Qz47/CnVMnUhuuYcrsz3BjqIWVLV0ogDczhqVL5lIXLqdxwh18ouQN9p5y4fMWUuT2EvaVUur345IA9lI++lrm1FZS5A/Ss/UxtpR/ls/On0ZduIbRUz/Bl8e088yWU2QM5E7EOti2bwfT532KWTV1NFTP4IrJs+lt20sE8MmTmTVnAjUFhfhdsur19RR7tjxL2fS/4PoxDVQWNTL/6i9xV7CX9mSCquppXDNpBjWFNUwYv5gZpZVEIz1Eox0cbj3Kgtl3MKG8hvraWdy24A5Gy73EgYA/xNKZdzGpoorKiiu5cdJ8/th6UkfyTmqbbuHKhnoqisdz3aTr2dQzQDI1wMH2E5TVLeKqpnHUFDdwxYSrqC4JMYDWH2WmXfUVRvc8z2+XPc+bW95mW3sE2S2j9OzkoRNT+KubrmZ0cSX1DVdw35JZnDgTJZZMMW3MNK5qGktVYT3TJ16P7C2iJxKhq3cXPdIUPjp7No2FlUyc9AEWT5pLPDoAQEn4Km68YiZ1hZWMmnoPdwee42AH9Ox5hqeUD/HXi6fREK5l2tyPcUtqK5siKQZiMiWFVVQVVlJZ1MDCBbdwbVMTPiXJ5o2vMmrOF1jS2EBlyXiWXnkjkePbSfqLKHK5KfSXU+zz4fEWUuYrxO0qpjRYhM81NPbWybP45MIp1IarGDvzbj7j2c/+Hki27+HN/jHcNf9KaguqGT1uCdePKqRQikEqQSQNhYXVVIUqqKudwx1X3cHUUhcubwFl/iIKPKVUBgsGD1V2rWbynHu5orae6uIx3LLoTpp7l7OnM0UGmbbSuSwaW095IIQs9xOs+ggfnDGR2nAlY8bdxPWFmznSAXRt4qHT8/n/PrCIxsIKGkYv4b5FUznelSTsL8XvClMSLKfAI6PWtPfMAQ71KFw35ybGlVQzqnEh986o4fSxnXTHFEgHaBo1i+kTxlJTVMe8KbNpTqyls9/8FbR85iGRefnmqaWdpS9Cz+qVby3t7KfeU81c5dfWMaMNpxP6TuuYKIjwzIWX2Xra1cOJb2T56PEViQGn/mhGTwSs8LTyWz3UcAJmDbroXFGcfMgvup5O+0zRWMn1EDRfeCLzRPzMzmbbzrpnaWs3/iJ1IHtPVH4t/XyDXfn15uqBOpdciKegoCDJkhoZCVDO/qdHJxcZsnh6+y0rMNuTWY3lK48OqfsogzZT85MlJCWj+yfLoj2SaH5xUstEeeWyz9SLTy1fK/ndWUK5BpveyZXRkwOr5K6Ha4RjduqlR0MPV0Q2OzbS0j1HO5Ohtz9KPNg8+Fo/oHhLWTK5DEizuud9poyqR1YGHV52eSiuGMuhgXaSIZC9YUJS9im7G7fcDxnjxS3xnn19nDSnezYxpeo+3Kr7pfWzSO08TpyA7vxU5jSHO7dwaNe/8v5BAIW+rjSjqm8jCUieAOpn5uftM0BbX5BxE4MquxVz5dXXA1DW6OL9fY/yWM9BehngyKkyPt00n1Sml2S6lKrCs8bBRUXtJColCdiFLJcQUv1RuuwOE4mldCQPURD0kN3dya4AA8RRUgmO96UZKKqnwDW4Tm5PAI83fE5+dbB4g/XcfsPX6G4/xPrDK1m+ejdtcz/D9bSxMVBGtcofPI0f5NMAhJkiH2DNpl+xKnacTKqLzWcmsRSI9XTTExxDsffsJHcBM8bNG7TPPnD5woTI+o8Ht9xPKpOhvXcnycj7fG/FunMb1vbuA9wZdVFe00RN3y52bn6FZUqGCXVXMKOhloDcxqGOvWw58EP2nz0jiQ3EKXBfS1xjLaEk5A0TOCebC7cnRTIDvf2HqA8qlHiznuAh6HHjkkHxFjF5VBO7ju3g1TXvEA+OZlHTPOqLfID2Vya6GUhUMKk8u8ASIX85EV81Rwf6qJFAcgfO+a8s1zNvcpzVa37J+uhxIkqaRG8vHwDSPa1sLKihRhXTwTF3cg/A6Qv1VmUDYqkIQU8ZFWEvg1MlKoqb2Lu/l4FUEmQ3fncAz1n5ZMBF7IIqblYozXKTUX4xegLiBERPl81yr2hjbhf06od2XKTByUU2M/uY1QqtbEZgJrPVuujhmNUoKz2MeIjIJiKrGa7eOultYo3k0qOrd1CghyvqV07XUw+sNs1mfmWHn5M+TiTWrXTQ0rILTuLJyIdEeze7trLyIVHZnIKT3GRFSxREcoaT/tiMnii+CF+ztRONcz3Z8rFv4myvL0rXSV7Qm+u0jjndH1nlN7P11R83ljGf8S/q36I1L5+QS5+Wve/WCq9lILqwVs5k1rgYKWZXNqNrI0NZyWnFz0r+oU5+9rRGBxckZAkyaHlISJLL5FUNSZs/DHHSendktyFtCS/FwbHMaVjEqOz+rqGAhrLJFHSdMJg1ODP7bFVrg1R3C0+ufokzgdHMql9ISuqlcKD37BGEfFYXcV+xggs2eYqCkomfOzORJMn4BDZ6hHUngyxorqC4ajw3VDVRt/4XPLvvIFdNcDF05iD0ndrIY2uW46mYypUNjZBooy/myQbaBWsvtumTkCWJptLZLGqYcH5+w23MLZIJepu5akYlHWeOc7ivi6P73+J0dD43TCwh5BvDrPpFjD93aOKnqmgqxTr8RNsBrbyZTIZM6vzsC05yXX5GNc6noriDY93Hae85wZtrnmTO3I8ws9zLheff8tnfJFVTV/BK4JGGemgmfYhn3nyIgerFzKkbRZokbb3dZ2V0oedDF274dXTj7PpccICfIeiSkfOQvM3WeriKg+i4CK5ovnXCz668ucpmVTBzqRVGkOv656tuioyL1HEjfCt+omNmIELDqjfJxV+dyCxKQ6S30aMxXL5pBXabW7vNqggN7ZjVpmY47ZMrP6ex66THFnmApvZH0Q1RLrIZ0bCi62S+U/6idCVJwu/xEe2LAQWDdksliSkyXo9vSO9t97BVy1M0loZjP2Y27nT9JUnC6/GgJBWSiRQw+PRMisXo8xUQHoH1t4ufa67Qgp3DB1G62ftukZNALY7IdTZpmDHXnqzpnWBqnVs9JhIoZuNZGlo51WPa+1b2Mr0vuSgrLsRzcjcnB6YwJuhCSSfoi8Tw+oPUV3+IJw5s4kOjZxJ2yyQinRw5toPCSTfiYnuWgWazpqAobgrcHtKq33a/UB6J+upb2b5nB2emVlHidaGkBti3ZxWF1d/Ci/5m3uOuZFR5DRQs4oZRYVwSpJIJMpIbT9eFPC5sWgoYXZni4ZYTfKAmjN8tkUnF6O2JEx04gcdTwI2zP8iEIhfJ6BF6D29AArzuUvyeDva3djG+uRiXlCERGSCGR/XkXxly+qe+VjQbyPP/Bzx+GopCHO/aT2eingqPRDTSyUCse+jaJdt4be0Bquo+TKPPjawouFw+UkoGpaSR26LL2DYQZX5hCIkMidgAAymF/u4uisqmsnTuzVR7IX5mO7uOHEYGCsqqKduxjcO9c5gUdiNlUvRFBpA9QUKaNTvvsxI1FYugo5SFDTdQ5HdDJkUsnsLrVohH+0lKHiqqJ1JZlaYsup0VJ9fSO+YzjKuu4KTvCq5vLsYtQToVJ6W48SpJCt1ujqTTgHtQb3+A8UqKjNa/TH1fobi4mZOxnRzp66U2VEwmFaEzGiUZGvz7t0g0gjtYzvjCSpoHKjhx8k0OdrYztbyOc5t0RUGSyigu6GDT4VamTavCIyucPtNCOtpGc1HhENukug6w230tX190PcUeifjAGd7d+zYAcvkYbu97jy2RhUwPeJHJEIv2E814KHF7GOUCd2boQVvIX8RAopWW013UjypGysTYf3I7Y4PNhD0e1GCU89T39K4vOCAxyZEi9/MFduTQy+1muVo936p5NMKxqgVW+VktuxlY1bXhglxqpdbOWRCpe9pxvSZN1PZafCu9cgVRuiJr6sT22WuRPsXK90X6Jyv7Dnducdr3WMklYlMz39fmFvV9PRmt8O3Y08z+lxYM7ZlA36ey11a+r71nJ7ebjRv5vp3rSwpkN0UlFcSPH6UjWUKZWyJ6poOOWJymwjBuxHJ7Fsw2g2a5TaSuOo3h4QY5XExFOsnRzjM0VwXwkKbnyBG6y4qpcslCMSuSd7LXZrVPi6Md1+KL0jerU8Npb7eock5A9BQiy9PqlMisoOoldi0No3t6dI1wrexjrrObmvKpFMrP8OzaZ2iq8ROOBXBJRUyZuICqOR9l3gu/5ZF3W6it8pM4sodD4Rv4QlMY6eg5BpqnmBKS5Ke2ej4HDr7OW2VzmVU7YYg84akf4u5DP+e/l59hbGMA2g7xfnwxX51WihTVPwBw+4qZMn4xb2x/jJd6q5E9AfwDIRprpjJRBz/Z08qxeDHNVUHGzPwclS8/we/Xz6Cy2E9hLEObMpk7Rpchp/t5d8/z7AkX4utqZ+/JDsrHZfD4y5nSvIBXdjzCc5EGfJ4wnn431XUzmXVuhzz0jQf19YX3NLiSn7H149lw+A2eW99JVVER0okdHOgbPFVMJwboON1PuKaaUOE0ri1+jEffUpg8xo8nEefA7v3MW/RJggU+Pj3jbX7y2h9onVqOVyrEc6qD+nl3UhsOkziwjrd3xwl7ivC27ePYGT9JJUNR4RQaizfy/HtPsbshSGGqEE9ComnSNRccAGh9KDTuRm4/+ksefjdJUx24Un7SXcUsXTKb6Ok9bD18BMq9RNIpTh2JUzJqEQVemSmz7mHvhkd4ITIKd8BHqN9PaelU5jSX01i/mN/vfYLloVnMqp5CUdlkpsUe44WdRSxumMkYHYMO9W0JT+UU7qnbyBvvP0f7+HJ8vWl2Hj9KbDyQ7GPfvtUcSXhxFUaJdXdxJKpwdWnZBX+KgiQhyx5mz/4ILRt+z5OpsYR8Csf37MY/4VOMLZFo18jgCjcwLvMCL22PUBoI4jrZxa5+iQnJJISn8Zkpb/LLVx7n0KQSfFIRnrZORi+4m5JQFbODXazZ+yrJUdcxT/U6REHJOOaP2sWybU/R1VcOkV52HXOx8Iq5FPq0PieWW7RjZvP0wE7usQKzjYgoXVE97NrHDMeo+RalnWs9E7F7PuqmnbqiV+/0ZDHb2Fs17UYyma2NiH+L2kpURqu5VmAnBrXXevHpNDeIjIvQNmpc1ZDPPs9qnYbrWjQXadfFCN/OIZger3zZ0wmYr4HxW6K5+L4dembjZocATuuNEeSzhgqB5KKqoZmilrW8szJNQ6mL9mMHSRdOprEqpNPLmv8Di072HqL7HivaZusxrOApZsakcl5Ys4lV0TOElV4OHuhkyqwl+DyyaQzq1Sone0QjHKtx0fVyGldZcNqjCP0MoPZEyizZWwkicsIiMlf9qTfuJNDNmio9HL1fAfjGom+Y0pK9hTSVV5OO7GdH3zHcwUksGDeLyoCM21VKU20D/X272NPfjr9kMffMuZIyjwSShDtYyeyqCrLPIiXZTVH5LCoCUFA0AU98Ly0JGF0ygWKfl5LyadSGszuXAkY3TIaBXezsPUnCP42Pzb+B+oBrcAPmLmBURQUBtwuXJ8jo0krK/D6KihuoDiTZ37mDw9EE9RWzmVpfhdcl4w5WMqeqHPdZfRPdJzkSCVJb7EPyVTC5qoQTndvYP9CHNzSHW6Y2EQiWUhPycLxrJ4eiSZrqFjO/oZGKknKKgwWUFddT5u1jX9ceTsZDTBu1mGm1RchIyHKYutpmitzZtZAJFdYyqTiAJHspKR9Dmc+FJPkoLR1FdTiELDFoO38p0ytKCRZU0VxcyMmeHRyKZRgfbiadVpjcMJkqT5LTbT34ykoJuDz/P3vvHWZHdeb5f+qmzlmtboVWQgKhjAIgQIggmWjANsYGD4MB47FnPePxrD327OzOb2Z3J+1O8uzY4/GAAzYmDmAymKiEQBLKGYVWq9Vqdc7hhvr9IV3pqlQnVdXtbuH+Po+evlXnnPd9z3vedE7VvWJ8zULy+rfwwtY3OZoq45pFX+PaKaWECFFUfQmTU3Vsa99HU7yI2TNXMrssj9yCSipiA+xv2UnDYDFzp1zF3HHjGFteQWlBMTWVNeQMHGRn5yESkalcOvMKagrDYIWIFlSzcGz5me+5WxHKKy+hPDefSTXzCHdtZXtHLZ3JMhZceCk1+bkUFlVQYHWys2krhwbiTJm4nOumz6IkZlFQNIFJJWEOtWxnf087Y0oXsWjqRGJhKC6fS7xrE8ftQqaVTaUgv4KqaCO7OzupKLmAcQV5RHMqmD62jIgVIqd4IgsryzP8LIeKsRdQFs2heuwMipOH+ajtCJHCWUxPdWGXXcqCiROpLCmlr2s3H7V/THdoIivm3MKC6mIsIGSFKCway4TSIkJAUXENk0ujHGndwcG+fi6e9lluvWgKuZaNFQpTUHYB88tPHpVY4XLGFyXY07yDhsEwF0xZwWXVpeSW1FCVH6Nk/ELGxw+wvfMgzfFSLpnzKS4qiWKHC5hYGOZwxx56QtO5cEwpsUgBNZVjyY/mUV05jcpIB7tb99BEBctn3cTlEyqJWhAKRagom8iMksJTr+5ZRHMrGFsxhfyIuJDRiSten2p5QWay1+XjViCoCgcTmXX6yorEIPQjm7sOVHLIdK1ac52NVWY/FW2d4kNXxzL70ZVb1dfLWuvqR8RbBb+HK6J2kdyiNidM7FVXLt0HH6Zz1aFtQksmm2yjKeurYy9BxDo/Mc19oxMiv7SSquIc3MiYzklm13704eZDsnxjwkv3oNuNtu4c5XO1iOYVUF1ZTG9bM80dfRRWX8Rll0ynPDd0Dq20jF5sQCeWmOYR1VyD8l05XYtZ2D3aAAAgAElEQVTcskpqiuFYQxOdA2EmXjyPRdMqiYXUv0eg8mWVbG7tXvXjJT6q5uRGW3aIdtY9OzP6aQqlu+iipDXkp3ABj0+jvb+dsr8rO31dmltK23fbJCOC4R/kZiCbyIacvmkm4/T2Jojm5hCmj00fPsq7XVXcc/XtTMh3++9EBmlp7SCaX0JRbkz6HfLfViT6euixcyjJs+hoeJ9/evsDrrr2PlZMGDPcov3WYDhiQtA8z5e49kmE30JzdPzoeL8bYF2MRPk/qeN1+57v40XINn/VRv98mf/o+PNzfMRtUCbcGOkyF/XzW+QN5/ggitThHj9UyIacvmkmO9mx81c8vPM/2ZEq4bJx9/DVpTcxLk/0f4nGqCiv9MfzE46+1s38bM3D/LpjH7mxZdy76CGWVpUPt1i/VRiOmBA0z/Mlrn0SYaJ7PzXB6PjR8dmof4Zb/k/qeN2+5/t4EbLNP/35fJ//6Pjzc7zyDYBM6L4SM1wYanm8vgEwilGMdOi+CqXbfxSjGMUnE6a+P9Jix3DzH8UozheY7gFGfWsUoxi5EP/vcpx03szzAacjq67d6Mnoq/qrIHoFRoe+SpbhQrblyiZ9t/XOJoKmPxzyB8nDj/wqXzb1NT990/0z9ZONtZDpPyh+2ZTfjU826TvjZ5DyjIS4ZzI/v/RNYaqfbOrftMD3siHwuxay+yavU4ruD7etOvv7oR+UfkX0g8ZQyz9U9VLQ47KRe/xu7nVrFJHsQ2mrQejtk5b3g+YftI2armXQuSUofei2m/KTHgBYlnXOaZ4KJgI76afbVYlZl4cb/Uw4X8UJ+qRStwiU9cn26WnmvP0WrDoHRtksiodCV5kIovBR+YMfmBzQ6QR2HTs18U1Zuxv9TP2YHjbqwOkLMlvW5eHsoyu/XwRtq276cMbPIOOYX19QzVdF32+u05Hfz/yCjhWq9c3mgYaOrZq+YSDzXZ2Nv9t8ZXSy6c+mtiqrqUT0Zdc68qnaTdfPpN00FjlpqGK7G/1sIFvxLr3+stwT1GGfypZUtiqSRbQP8VJHqNpNXqdXwa9v6mzwdPZMQcFkT+UG3bzqJzfr2EdQa+yXjt/DUWesM5U/lBbC+VdleOk+zpNRp4O5JePMe86/ooCg4i9yDOdnt3uy+Yj6ieA2H5l+RRvwzL5uOnWTx42+7trq8HFbOx05RfoStcvWQWeupu1Ovs61kyUL1VxlCcfr2qrm4ORhOsatXba2sgCkE6wz/4nG6/ivU14TX5bFIVE/mX3I/F/02cS+nW1udFV9dNZOd21V+pWNcetvap8qejJ53MY77d3Nj1VrK1s7UbvMRkTz0eEti91u8xPFMRlvt/Fe1luHjxttt7XRkcdNJ6qNhVus0uGjsgfntWi9deJE+p4qB4nm6cWXRfYluudGRxS7ne269N3ouNFQ+YNMdlXs0vVlkbwq/cpqSLca082//cjjRlMWm0T30rLKbNntMEDHrpx8dHxHRFN3vUUPFERrJ5pP5vyd/UQ6E+nHJH7o6keXt4p+Wh8yu3I74MukYbK2JjbtxZf97u1U7U6I/Fa0tqFMJmnFuTmY08jcThMzhc2k5eyrc4roVKLbSYcbbady3YzHrd2pAzc53QKQah6ZNEWnyG7G4rYBcZPRjZZI5yL5nQkis6+bfpy0nGPc5HJCxMdNHqesTl0425wQ8XGTUXbtRltnfpl0RIFfpD9ZIaqyWTc7ktmQiI6JrjPnKIolbnpwS+xuNiIK/jq6FI1xzlFlQ85rt+Qr05XMFmXrolpbJ1/ZervNO5OOk74MmXpw2pAzljt5i/i5+Ysqtjtpy/Ql6ufk6bYeMj3qxCY3ejL7dvJwXovitIiGWx4Q5QY3WZ3rLaIvK2Bk9qXySzebzZTFzV/c6HvNWc57mX9F/DJlV/mW03+cvN10LooTotjhNl+nn7rZfmY/kWzO9RDFpsyxsjotc4yMvptuRPNxxm639ZPp3E+doRubVHDjpxM3nf2c6+kmcyY/nbwiouEco9KrbL1lcUbGW/RZtN4imjIdyHjL4r2bHLLYIZLHCx+RDlRxVDd/yXiLaGdCFjNksUY0V9ncRHxE83GOkcnjNt5rLnLzf5EvuI2xUqmU7RbIg4Bb4tFJgEHxFH3O7AtyRYtog/uPALb+SauUp668bvKZ0gsCKh1mG0NlK0HQAvkGPBvwsz4m/f3Oxct4E1/2K4+omDAJ5CY8TTYBfuBHh6rYpCNbNuNHtmjLdD9U8XCoYu1w8xkptUC2aQcRa/3EJp14I2qXFZtBIcg8pksrm/FjqOuA4eLjx65M+o/EuZnS0+GTTZ46/IPmme11c93UDgG/oPoPtd6cdENuJw6ZJy1+IJqAXz66/Z1zc47LPC1xo+/W35SnG93Ma1l/p3xuJzsm8KJnmXx++evI42XTqNsWpIO50VKtf9B83Wxcxt/tsEmHj6i/7J7Mz3R4BmmHMhqipOj0RdP5O3mq1koUm0zhR4em/d3mIysygswvQfuyqX2k75lAtf5DAZ1DqCDaZPrMRlzM5Ok1jwVVZ6h46uYlr7FJp5iUtafbnH9NoLIXP77sVjdlfhbx9rMBMvFd07zsFbKDDhN4zcuyvl58KXOczoZWxMdk/kEfcInmr5uX/dbsKrmC4OlGQ3VfF7q26DWPmfb3G5t0273u9UxqUICIjHnQRYgoUAepVK9tQcgFkEgkjMeMYhSjGMUoRjGKUYxiFKMYxSj0EImc2cbqPIhTYagO33UQhOwyGmcdAJi+RqHqH/TrL35fW/H6WoWJPtra2ozpj2IUoxjFKEYxilGMYhSjGMUo1AiHw5SXlxuP8/I1Idk93f5e9srg/WvqqvazDgB0X6fQfSUsqPtu7V428l4PD2QL4+w3ZswY34cYQR+KZJOeCqaHNtmcbxDfx/E69+Gg53W+Xmn7kW846Xmdrx8aQRxGZtO2h4ues59f/Y10ejL6Xml8Euhlc228yDaU9H7bbOd8knWk0oNgfp8mCNmyQc9JN0h64O/rIE56Ih8fCfI5aYzE9Ql6D+I2LnOszE5V95zj3OR2axfNRYeeDM65qOiFlBRdGDiFF0HWJqJnAh36bmNEPJ30ZPRFNFTzURmDbp+0fLpGkS35VOtvwjsb8rk5uilM52Ain1c5wD3xe11rnT6iQKKipwpGbpDZts58dYO5F9pp+UTXXuXTQVD0smU7fn1PVtR6ma+zX1D0VIVZ0OvrFV4KPS+2rbO2bn1M47lMPt211kVQ9NxsRUZvqPOUjj6DtEUd2qq6IrM9KN/LRJD0vB4WyeCUz6+MbpsVHahsx6tcovl7sRXZtVN3QekxKHpOGqbz90LPD4Zqvqa5x4RnEOO87hN0anwn3GxaV76QyabX2e7WV0XPOd6kfxDXzjZncSO79lLkmI43oW0abIJwFCeCDiCZMJFX1xZl8qoKTVN+OpAFMp3kldnmxxec7br0RPK7jTfdRA9lLDEdr5JPRS/oWGBSMAYBE1tyyqDaCLpde+Fn0q7CUMfeoOdrok/VBtTUt92KGBV9WV8dW/GjP9V403YdW5FtaLNt204EvVn1Mt7kAHIkyCuDSfEuGqObO/zWJTq2ZmrbXmSR1RWyviZ0dSDSp+48hsJ3g8ztQ+0bXsbLbM60DjKto5wYCfoy2UM4EcosytLEVMVB5me3TbPzs26QE91LQ7WBc1OG7NqNn+haNynrnvLLYKIvkwU3Lez8bKhE8sp4u8kra1f1la2FDmT6crNtncLO2WYSAFSHFya2r9K321MFU19R6cMklqSv/a6HTH6nnH5iiUp/QfqGjJ6JvtzGysabFDduhycmsSbotTSFjr5k7Zn6cv51G6sT651tphsDWbusUBL5tmi8LM+76UTlZyK5MuO8Th1j4ht+4opO3Jfpy6/ty66d473YkJdY4hYPZPBj+0EiiMMZ0VrrxgOZfXqpS9xkM6lBZVAdSJjapylvr2ul0qfKxzP7imin23X3W258hrJmDzKWiGh7ybN+YomXml2Xtg5U/m9Ss2de6+oz5MZIt5jU2VipBJTxcTNON0cUBRnVPGRjVbR0k7IOfd2xOsblNVjq0DJNDqqCVzRWNwnI7EQGEyf1U0jqyOL0O7fgFMSGRXYYIlsfVTDU8RU/xbOs3c0+vdp/5ljVpkMlVyb8FKY6QVzlW6pYIvM7lT69xH0RbVV/3ThqkiSd47zEWxUvkz5+bd95LfM7VX9nm26u1IXT/tL0dfQnKvh0bUgn/3uxfdWGzTleN+7K7qn6m9QhKv2raKniflCHHG65zGTjogvTWJK5nl5it5OWc6wzF6tqBz/1lht06n0nPVXNLpqzTG7dOG0SS9K8deXSjSU6vJ2f3a7TEMUSUbvptQyyGlJXVlEN6UXfIj7OtdBZF1EsUdXk2ajZ0+NN9e021o12JkKZnVVFlx/jcUI3ueokdTf5ZY6ia7imipfRcpPXCd2DAdU9P9BJDCZ6NLEvNxl0ZFUlf792axLoTA8XvN4TwYvPyopv06JN955JUPYKmS5kCdctiHu1IVFC0JmbTnHk3ED5QTZjyVDR8pqA3TYRKlv2wkNFXwbVBjDbcU42xnRzqpMXdWKS27VKVlGhL6Onk7tM5JDlRZN7aVl0Y7dpPM/kYSpb0PHEK30v9uLnENg0lpiuXTb8QlU3iO55PXA1tW9RP5N10lkDlS7cDi5V8rv1c/q/7trprJPXza9uW5D7IdXcZfrW5WNij15yVZCxT+eAQwWT/hGnwbspQnXi7nYtopNp/M5TNy/8RfKIFtSNv2gOKv4iiOjKThtFbU4ZROPc2rzyd5uPKQ+3IC1aZ5FO3WzEdP4y/io6omTgxf5FyVvmE6JEJ5PbK3+RPCIa6Ws/9uhl/jJf9MM/k4+bPlX61uHvR29uOvDq/zr8nbrwwsOLbM52L347lPy9zF+HjpO/n1hgwk/FX2aXMnky29zkEdm8mxyqfKKav0ofsv6qWKW7/iay6bTJYoMb70zo2rEbD51xIp5Bzl81Jxmy4f86PLzOX8cWTexBlg9M/EzkC6Z604kNopgYNH8nRPOV6VtER8dW/OSYTN2oeASdR03XWNeP/eRY3TYVzXQfP/OXzU91rdNXN39FMgeKBBO1p9uc7ZnXos+Z1zL6IkVnyia6FtGWySaiKRubCWd/EQ/dNtmcZMFOJLubATnbnIFV1NeNpmheKhoi/jI6qvnr8nSbh45NZ66NSqdubaK5Onmo+Gf2k83J2abL30SHoms3O86kLfrrHKcjv2j9ZbFEpDPnGDd6qjVPxzGZrnT8WGYLbvx1YrMo2bnN2y0JyWKMztqIkplOX5EOdHSqoum0TTc9qZKySd5wtnmJDSLbFM3RlK6z3SSPyPi7ySrj71wXVWyW8XezB5n9usGtn8n6q+K4Ti5w8nDTi2pOKv3r+p/zvlvhmcnPdP4yHchipdv8Zb6hM3+Z/cnkFM3fbawqNon6qnxDNF+nfDLZRPlZtFbOMSr9u/XVrRtEc1J9dpufm/ym/HV80i3P6MRGnX2DzDdE+jCtMVX+pqPzTDjnL/KrbPOX9dPlr8onXvKYc01l83L7a9mZIwOGqGA+X6CSv72/nbK/Kzt9XZpbStt320aMfPpIMhBPEYtEsLCJJ2xC4TBh4/8k8vyGe/HXw/6DRyioqGFccYFU37Ztn9IfhMIhQlb27X8ofUrJy7ZJJFNghYmE1eNHUjwYSbLoQLRxVhV5o9DHSNahSrbh9DUV75EcB9IYiTKlMdT680tftokciXo+H+zzfMJI1udIlk2E8zGepmEq21DPVbaRH8l6TcNUxrO2eG5nAbLzAVV/3ROWIHnKkHmC6AVeFt+Ul0n/zJOf+EAf8aTHs5y+Wp5Y/R71/YPQc4xfbHqXD5q7fMkWVP8z92p57oV/ZUe328heNq/6Me8393teWzj3hCzed4I33/hf/MFL93Hv03/Kqwc7Xfufdd11mH/7cBU723t9BwsdW1fxEOmjY9u/8bV1B8/pJ9OfZVn0H/+Qv3r7RT7u7D+3w0ALL25+k9ePtQvH68ruJkcqmWRwYIBk6uR1b9s23lv/Aw6da6pCGiKIZDGNLbrw299Nl6rT5iye9fpGsLEiGJ5uT36GCn5lM/E1XZ66/UW8dZ48BYWg/UuHfrZiQBBrawpZHafq74QsVg1FTeUXzidsOsh2fxlSiX4aD+3klRef5tdbm8mGukxqdNUTSlP6fmDqS8H4eYLmQ1t5/NGf8X/+9WEefnE9R7oSRjRkMvrZEA913jX19zP9+6nd9A4/+NHD/J9/+wXPrNtHx0AqK7FP9QQ9E8NRU5nEWhVO/y8A6cGZxDONyXlf1V8Xbv1lNGQnyc77zs+ZNEz66/Zxa5Ppz+2zt/7dbHjrS/x8e4PR2NOfEz3UNTfTl0phJ/uobWuidSDhS7bMuXvBuWvbQ339fjoS5/aBPOYu/V0Wl+dor636c5Jd7/0ra8Kf55EH3uTpW3+HvWv/lBfr4tKxdqKXA23NdMbPDfBB2EIm/NhwvONjNrb0nMNLRT/V38LOxmN0xZPn9kkOcqyjkcb+wUAD40laNq0nXuexV/+cvR0n7+eVzOKKRQ8yqVA/Ppl+1l0zN16ydRhJtpDtzzqQFV6muSe7sVa//1CulWn/IPzFS38vyKbfBtlfJrNbvyDrkKA/Z8sWvMDvWpl+9hprZfKraAVXt8C+1c/y6Fvb+fjwUQ639wVC00RHurFZBp0D+eGKCyJ5XO/bNp31+3lj9T4mXH4LX7//Ti4tbeSt33xAfU/qvPFbWX+TjbGnWGDHqftwDb/eneKWL97D179wNSX1m3j5oyMMpmwtuXU/i2T1G8+y7XteP0ecQro9RUrfd7Y772cah+rUzzlWxCNTWGe7U9ZMOWRyu40VzV811gkR7zNjbAa7G9jdsJ39g52U585mwcSLqMgNY2HT11XPzvotHIoPMjZ/HosmT6cwYkF3Ha+3xrg0r4mNJ/bSZVWyYMKlTCu0OdL4AauaDrAv8RJTym7iysnj6K7fQ39BFT0nttOaO4n542aQl2pjd+2H7BvoJj82g8WTZp/iK5lLcpDmpl1sbtlPB9UsqF7EtIp8rO4jvN4aY2HsGBvaUsyZNIeagtyzxvd1HGRT/TYakhZjCuZz+eRJ5IVDpAbaOXBsKzt7ThAKT2bBuDlMLM3HAux4D/WNO9neUUsPlcytWsz0MYWETyqVvs46Pji+hdp4iAvKl3LJhHJCJGg5vofEmDlMyEtyorGBZF4+Pc072d7bQXH+bJZMnEpxTgRI0dN6iI8at9GYKmJO+RzCIZvK4jGU5kUzpG/nUNMgN9++iAmFQOFlfGb+Tl480YhVMxGIU3/oQz7qricRHsus6sVcWFZ4li5t2yY12MmhY1vY1nOcwtw5LJx4MWNyT75409O6j03Hd3E8GaIqfz5Lp00iatskOg6wvaeIifZBtvckmD7+UiYVhjh6aD1behpIhKuYXb2YGWUF2HaSntbDbG3cSn0qh4nFs5lbPYnCKFiWzUD3cXbVf8SB+AAV+bO4ZOJMynJO2Wiyn/r6D/morR47PI4rpl7GmNyTNpvorGVd3RYasagumMvCCZMpiJ55YaivZTdvHDtAX2Qic8fNZ3LJqTXKsJ1Uoo9jDVvY3FFHKjyJyyYvoTr/ZK9ETz0bajdRn0xSmjuLJZMvoDh6ss0eaGH30S3s6WsnN2cGiybMpDLUxOr9b7OueSfNe9dSsGAx4+mkobWO4oqFlOZAYqCDw/Wb2dF7glCkhsUTFzO+MIptD9JQu51U6RTaTmxg70A/VYVLuHzqBKKAZQ1wvPYjPug8ih0ex+zq+UwrLSZknT2fTL82ve+MW+fGhXN9z62PaUzy0l82HxFNWX8VVLlARw4Vb91ckNlfBHWMV3+fMfNaNDfZPL3Mx4SXzljR/J1FisxORHKq/MUpo8qeZfd1dCqSX1cXaXlNbFv1WTUf089+dCob69cWnHR1YqeIVrb8xe2vs7/ItmU8TOMwwMxr72HmtXBk9bO8GRbPRzdu6coWRG1usi8w9SMnZLZg6udOmmf6JzjRUEd4wnwWX1hJPjB7/mKOrtrOscYuxk0tPl0zOumaxgjdfY4Tsvu6ed4Z53R4qfqe5tXfwo6GJIuvWMzksgJCFLB8aRM/WlVP78IaYjlh4bqp5mmyR1TlbxXvIG1YJ9+IZMv8LPwRQLeBmQucOU4nWLkpxPlXJLQpTdm16SK5BTQZVMkp0XOMtz58nm39SWIlCRo7jnOipY2V86+kJFTHG+/9kv2hfMIlEdoO17K35Vq+uGgBxU0b+PbqY/zviWNpzW2ko30HG/a384c3Xkdffxut8QHa+xtp6usjyQB7Nz3G6sh8Li62iYytIGG3sG7tT1nXFSF3jEVuRy3bjrby4PJrqcjUwVmTSdB4bA0vbHif3tJcklYzLYfrGbj8c8xuX89/XX2cv586nvq8Ui5Iv5edRu9hnn33CRrzCwnnQcPHeznY/QUevLiUzTvfYeOJBhJFA/R31HH4aDN3LF3JpHybw4dW8dKubdhlMeLJExw7VE/nkttYUgUDg61s2rOGmoJOTsSb2bl1A/YN/4NFY/rZ+eHj9C79cybk9bFz++tsG0gyobSYE3YDu/Zs4Hjn7/CF+TNJdX7M6+tfZG8oRX5RJamGw6xpiXH/8ju4JC+asW75FOclqG3qYHFxCSFg3PRb+MxAEZCkae/TPLKpkfIai+TAcT7eX89nrv8i0zN1EO9my7Zf83pDM7Eyi5yeFk40d3PLossoGzzIM2tepbc4zGDEpn7HRxxL/iF3X1hOX93bPLy1l5UTx9NbFGNCIk7z3ud45KNmKmosUqf4fW7lF6nq3cGbG9dxPDZAbzRC7YGjtF18A9fPmEyot4FV659g64BFpCxGQ20DJ1p7uXHBIgDaW9aw/sB4miJNdNe9xYbmYr63bBa5nXt5ct16evL66Av3U7/nI473PsBdsyefnFf/HtbvK2RM+XFauw6x5UAL9yxfyfSMLxTZdooje17kl/trya2IkjtwnGPHuvnsVSuoSh3l5bWvcCySIB6Lc2TvTvZ13MXXF83AireyZtPzbGjrJlZmk+g4yscNHdw9p5KW3hbaEt00drfSl0rR17WHDzb/JxcvXUhxNMHWjY/wm6YIsYoUscHjHK09xMqlX2BGcS+bVv+EA9XLGZfbRSNt7N28mib+Pz47tZjWw6/y9JbjhMcOYCd7aKnvwbpiOdML8s7xX52CR6ddFmtE16r7MjqiuCe674WHiq6Kl+ivbLyunDLabuukUxiqcoNJPlTpSySPSgbT/CXjpaKtk69N1yuTrkpO0X1VThbxlq2521hVgeekbeqTInl1xuvQlBXRqvUwsS/VmMyNgQ4vnaLfr//rzEOnHhYV4iY2LqvJVTKq7vlpN7FHk7imEwdlvEwOXt1ihS/7SCbp6mojb+wS8k/dChcUUhqN0tXTTdIqOet72Cq5ZPAT4zPvy+ar0m0QMqTpphHv6aY7FmFaQf5pXcXGVjGmczuNqSQldkjbPpz3VfYlo+Ult/mNnbp1ii6PiFsnXYfTKXB0TnnTY/0EehlMFeyVj5pXkqbmHdR153PT1XcztyRGf+tOnt72MQdbu5nU+CJvJ5fwvWuXU5Ufpa9lD/+56hlWV13ILYDVO8iEBTdxS2kR1kADTz33h2xqvY1bp93Ip3c8zPYJ93P3zIlYVg+wn87IZ1lx2WKKoiH6Pn6CXzZO5Hu33M6kohxSvY288Zt/4Nl9i3moxl3axEAHH2x9iVTNV3lowYXk2O2s2/QiOw4fYnopWPEwkxbcwqeK8856WgpwbNfP2R5dwXevvpyyqE13+2Z+9fp66mrmcrCtnwVz7mHJhBISXft5cu0m6tvaqQ6l2LbvPcov+AafmzWeSKqLLVvfpuHoAXqrYlihfsZPuJbPXFRFntXDurf+gqcONrK4ssgheR29XM7yRTcyNidF855f8s29R7hjzhRONGynOTSZLy67jcl5IVoPvcEbTYc596cF8pi35AYeXft3/OPBq/jc4muZUlrFxAKg7wDPb6hn0fX3c0PVGKxEF4c3/ohn97XxnSlnKHR2bWfTgaNcvuy/sGxcCfHWnby0cRUfNc5hafc71OVfyx9dOYfCcIqOo7/m/364g+4ZywDY1R/iO5fczuSSHEJ9+/nRB8e47MavsrKyDCvRxaENP+DZvSf4TOwYieJ53Ln4cioiKQ7tfIbVDdvonDSFRMNmdnSP57aVn2FGQS69J7by2o7N7GqZzYVATmwCSy65jYmFMeKzNvL9Z1/gyOJZlB9ZRVveJTx41RLyQ3E6DjzNH+88fOYAIFzO9FnXc+u0KpJ9dbzwxk/56Oh8pk868waFbR/h3Y3rufjq/8atk8cQGWzm7Xd/xJu1l/K52EZ2JGbwjWuWUxK16W58h799ew9diy8k1fA+HzTDyssfZP7YAgZ6DvPy2+9Tzxxun3sHqa63uWLhp5mZD50Z3/1PdO3grf0hlt96P4vLi7AGm3nv/cd5Z+8BJi0Zi21vpyv3mzxw2QUUR5IcLfp3/nb7fm6cMotD+xsYN+/TfHZaDVaij8a2ZiKhs0LjqTnJ451JPNSJMX7ikC5MigyT5KUqOL3MzY8uZE8bVEW4FxlM5+elQDfll2178qoblVxeNkayvqZ2rrux8WPPukWoKV3RPdMnZaL2oGKZzlNxHXn88vMCUWxRbSz92I7O4bMXWqJ2lYy69uTFVoL2dVkfEU2vsdPGJp5MEMvNeLs0HCZq2XQnE6TEQ6Uyn6Yf0GGc1/HZyieZOTmRTGJFLMKZvywdi5Ib76ff37eLzuKV5pfNPOplT5tNfudWuS6DRIO9BmeT9qARhMye+aUSNLa2kqpYwIWluYQsyK+YzT1XX4wVCrHpg18wd9Y6qgtOvpafXzaN2VNmsv3EcRJjIJvAmz4AACAASURBVJI7kanlRScXLa+aqbmHOdIr4tdDTcV4iqIhwOZI7ZPMmP4vTCnOwwLCBeO4fO6V/OvHh4jXuM93MNHIibYexs6Cuo79QIpUTgmhgSb6gEhsHNUleZz7nwV0sf9oP5ddMpuynJNOW1i+iPvvXEA4EuK2K2vo6m/nUOsJEnYbRCxIJRiIt9HTX8q8KRPICVsQLuaShZ9mvm0RZi+x6Himjq8mLwJQyNjyC6jt7gGcBwD5VFdPojQnAiGoKJlMQ3KQVLyf2rY40cpFTMiPEbKgomwyJcXdJF3mXzHpOr5RtYT6g5t49pVv0FZxL19bfiUTWg/yq9hsXqwsIxICYkVMu+yb/KEdgc7jp8d3nDjIgXANC3OOc7D1OCT76MsvoLOri7wL7+WbEzpp7zxEg50glZ9D0WAPScvCArpyxzOhKEoIsFsO8ovcebxdWXqa3wWX/zF/QISIfT3V/V20dx1in52knz5sCkim4HjjIfZW3sS3CnOxgIKxc7lj+SwIRWjfD3klM6kpOtkWK5lGTfgpugfholm/y4P9fbR1HKDOTkA0SirzNw2iY6kpKSKERSivhqtr8vk/tY18YdLEM6bevJv3E9P5clELh9taAJtkRSWtba3kLLmFb43tob37MCdScVIRm4JkP3EGaWnrZHzlVCaXF4JlkVM4ldtursEKh2k95mqmAMTrN/Fq5fV8u6Lo5GFUTjlzLphP594dtCWuIxTqZGr1DIpjFhCmYuw08vZ3kLByqaqM8vKu7cwriFAQi1JSXE1+7NzQGEQsExUafp5u6yCIJJO1uKjJP0h+TgTN3zTP+OU/1HktSAQl11DT8dovG0W7DKYHLqYIwtaDnr+M31DPf7j1DTYIv+gZbF7zcpgXZJ9s7FF0+wwHhjqPqjDctj7ceTSIg38vfXT5O9tcDwBEhLJ1UqqLkeqE2rBP/pJ5ihDpqdhYRCMRIEEilSAvfOY7+RZgWZBI9p86KbQywrgFlvz460zf1CnaobPSgBUOkYr3EqfAXVy7l7q29Ty34X9SctpSJnDdrK8QpR4sS5BWkiSSED7rtYAQ0WiIVH8r23e+w6rDm9jPETro50THDL514XJsEiRti5B1RgOhUCTjgMHibBOwOJncXOae1q9tY2Gd7JVK0DrQS2dhHhErs5/LLOIdHOuKMqG8lKmzrue/zrqSNa/9D36yoZrvThkgztn/hYYVjpHj1EK8mc2Nr3LovVfPOFruAu67IJdE+8c88/5rfNy3j/pQJ4N00J/6fb52+uT+jG6TyX4SRM/hF7MTdDTv4r0N77Gpezsfh3tJ9h5nwpj7uQFIJHpIZay5ZYWIRDK0ec76neTd176bNzZ+wOb2LXwc6YR4C1sGvuqqZ7CIhPMYSDqOgQZ7OdD5DP+4ag2nz76jNXxqVgHJrjre2PQWW1q2UBdqo49ujvTcwlexSaWSp+Z+5tXGSCSKaJ3TSMR7SIZCZ95EscAKWSSSvZz6vcKzvOfkx5OF0cQFD/HH43by1rZn2T8QpbrkYpYvvJSaAueKqqGbAEwLFb+xUwWTJww6MJU3aP6m8POURwa/r3MHRd90btnUuy5dExlM7C0b/E0wFPZs8mblUMPkiW42+AXBx0Te4dZ3ur7xomPV10ky3zRws7Whhm4s1O0rGi8ae+59i0goTGIw4wFKMkXCtgiHxL+/5RWmuWA4NuymCIdC2EmbZDJ1Rt54gsFIjJiD3Ui0P9M8lu0DjEwIDwC8TMTvUyS/9FWO7fdVJp12aZ9QiIKCPGLtTfQmIDdyUpZ4PE4oFKK8cA5vNDeSvGAsYcsilUrQ1XaUnMprzlqoc+mHiIVCkmASpqLwYvY1t5BgwmlanY37iJRcQi4dZ2hnjIqEqpg38VY+tex/cmWl4z92P7BVooF8KgoH2N3aDzUlp++m+vtpa9nD5vpaLrn023xzYhnhVBOvrllPGRAOFRINddLSE4fC6Mn1SqVIpFKEomJuYjg2jeEoVXkRWnqb6EtNpCAEqeQgqaTLf2nXt4+n1yf4ys1LKQQgl0mTF2HXtpEoqOTigQO02Db5nFmP/v5+Mn8GMa/sIu6YMp27brqFMeGzV+fIO3/Fx8X38F9XfJOynBBW/CP+4ZmmMycXmWIXVjKr/zDN2IzLWOWBvjZ21W6jIXcuf7D89xmTH6W79lVeO3Jyx1tcXE1lcws9TDt9xJNIiP/7mZOUBzm8cxX7c+fyR7c/RHluGFrW8o13z/7fD84gQUtPB2MLc87StlU2kRWV93Pv7fcywRFljm98jA8HZvDNWx6gKj8M8d18/6ndYEcoyAnT0drNQCKFlf7RwcFB+iNhQlaE6LmvmwCQUz6F6XvraU3OojxsgW3T1dlKd04NxTLbSaVIAgVVs7l95WwSfc28/sZfsvrIZO65eNI53YN4wqHTz/TrBtlAELEw2/SDlPF83OwFRd+ZG93sTcYvG7nVxOaHcu282JxJ0Z3tOkiHRhDw+xr+cD/NlMlh8tTRbxzzst7OXO1Vl242K/JREY+Rso5p+F0LFTLHh8IhiopKOXCimb7ZpeQByd4e2hMJygsKXTdg2banzMPuIGNcthArKCR/IElbTy/22JNvrMabm2guLqUqJCgIDeBnrkE8mAkiDnpdD2PtuQWWNEw3/05aQYxXFecyGkG9But2OnqyIcL4shq6Wj7kzYPHiadsepv28uHODzneZzFhwd2kdv6Qd2tbSdhxju1+lleailk0pfzMQrnKmEtZXim1HW1CmSrn3kV13U95dtcxBlIJug6/wr/tTrJy9riznyxnfI7mlDNxbCUbN7/Fib4EdnKQukPb2VvXqtBAjItmLePAR7/ko6Y+IEHfiQ95cvMRInYSiFIYy4XkIB/vWcP7hw/SD+TkVFBdUcL6be/R3JfATnayY89attR3ej4pPUtX4XwuGFPBidp32X6ik2S8h+0fv8uWpsZzB+ZPpLDhhzy+9TD9SaD3KOu3vkJRxWRyS2dyf8lGfrBmK90JsOJd7Fr3DLt7z5ayrORCCvu38fyuWvqSEO9tYc/+j6jrABggbJWQHwsz2FHLb9b+hqMp92+EWaWzeLBkPf+yejvdCWCwg51rn2JPXxjLDpEfzScvFqa//TBrt63jQO/JA4Bx1TOpbnyRtw+cIJGCnhN72LhlDc0JmdtbYPcTjhRTlGvR33GIVZtX0djTe1qXNX1beHVvHXFS9DZu5tnDUS6dVnXWGoXyZrEgfzc/27iLzjjYiQEO7lvN3mbAHgQKKcoJM9h9nHUb3mZ3dxdYYarGzSLRuo13DhwBUgx2HuDVLdvo7E0QC5eSSEF7f985Ukcrl3L1wH/yqy376YpDb9MWXtqyhvLJ8ymUTrefXRtfYkNdEwCpeBeNPVFCkbNTs23bQ5r0gohDJnArbExk8Dtep90PD53CzQRu9ILm4Remudk0d5q068rgp32o4EVO2cGGW1+ZLfmtg3RkCAIq3/MqYzoWDxWGwm5lsdSL76qudaF78CfrM1L81g2mOcWpa+VBixVhzNgJDBzZxva6LhLJfg7t2kxDbw7VlUWuGzA/fuHskw3f0xkfKHIrmDkmxYYPdnKiL0Git5EPPthL4cRqCiNh9XgF/NQxqlgbxJ7SNH6YQPsAQHRi5IVxUEakSpS6NJyfg0ou58pnUVi1kHsvvYK6Td/m2keu5tvvb6J84gLGFYQoqryer1+zlPdXP8i1/3ETf74nzv03fJmZhRGIFjKlpIhwhnx5hZMpitnYtsX0BX9C+bG/4HPP/CWbm0PkFU6kNDdyOlmGChbyB7fdR/PWb3Pzwyu4b/VWPr3y61xaFsEO5VBRVETMsrBDMcYUFFEYDRMK57N48b1cWbyPP3t8Bct+ej9P1w1QWVmKHStiSnHhaXls26Zj7zs8uf44tm2TO/E2vnPFZB576TMs+/Hn+e8bO7lmwVSKxy/k2inF/OyVT3Ptzx/izY4Klk6ZRsxKYkWLuWLR3cwPreYbj13D9b/4a/ba05k9qQzLzqG0dCx5GRYbyy1lfH4MCFFQVElhJASEKcivoCQ35/Qr33Ykn0lFBYSsMNXTrufeWRN44rXPcv0vvsnmzmnMq5xAGIve9jrWvLaG+j4gUs0X7/gTonv+ghX/byZX/PxPaJ70p3xt4ThCoWIuv/l/cF3HE3zpJ1ew8ld/x+7ypcwpjUE4xtjCIvIiIWJFU/n8NZ+l5PD3ue2Rpdz1zD+zJzGeymKYePV3mXf8r7nl4eU88Orz5E+/hsWxfnqBUE4JU4qLOH0cEy7hilv/gqtbfsY9P7mSTz3+9+yvXMacsjIWT7+MnI7HuO2nV/B7b75GTvUyqvNixJMJiqsW8YWl17B73e9xzcPX8Z31B6iccRVjc0KE88YyuTDzFfcwRSVjyQ1FuPjSe7i45Sfc8ONrufeVlwlVX8r8oijtto0VLeSS6Tdy7eAqHvrxFdz88qNUzr6Dq8ZVQihCWX4JJdEwWIVc96lvcFnXE/zuz5ax8uf/hdXdU6gpt6la+GVuDb3JHY9cyRee/xHtFZewrCRGNxArm8dXlt9E2+6/5LofX8+XX3+H8okzKC+IUVg6m3njx/EPL3+O7285QiicR1HBWHLCNqGcSu68+Y+oOPJ97vzZFdz14pPMWPLfuGVKCWFCFBRPoTiW4YmRAsYWFRCy8pg1azEdO/6RW358OTc+/Vd0TvsSN0+udn290XlgmAlnYZr+nPk3s082r03/6dAXzdH5dNN57YQqvjr1lobfIjYoZEO+oGR0W7ORSC8oiNbCD71s0NK1+TTcYo3oOt3Xrd1LbBDJr3PtNi8vsUCmN50DDhnNIBB0TMmk6fdpYvpfJK+IkjxPr06ehulhlC6C0J/IRkx8zbn5E/mBc7zT9zLpnUUHi7JJF3H9ZRPY8cpj/NU/Psyrtfksu34pNUXhc+g55XCTS+V72awLnPNz04mO3lU4i14oytTLl3FDTTeP/ujf+KsfvcDBotncumQKUeevj/vkrWvPunlCh162cqIOLFvSO4iANJTITDam97zQa+9vp+zvyk63leaW0vbdNt+yeL0nWi/d+TrxiVx/O0U8niQUjhAizpE9L/Jc7QC3Xnkn00tiLmO72bH7AEVV05hUXuz6BsZwrLVo/hDsoZxX28k2/Piwbj/ZPWdh+0n1dT/0smk3QdMfLh8O2tf96GV0rfXiBKhffR4uX892nhDRG4k5QoRs1oRB3NPl6xV+64RPoq+L+Lr54ifB10dqrA8afnzOD73hihNu8oLY1yNO4k5Gbvf9Bi0dWm59VJNxuy+750WpzuJf1k+Hh2yhMz/rzM1EL2783MaZnCbpBiQ/+pfx0+Id72Lfnnd4q+ED6lIxivorWTTzRiYUxs6hefJvEXMuXnCGiOb8dG3RDSZjTXTg9B+VfenQM1m/oUgezg26WwzxsjZOerpx0dSH0/dUcVjkm370G4TvOuUzlUfEwzQvmfKW6VwkZ7qPW4HoJxeJCk4d+XTn7KYfpw509RmUT6t8M6j44Tf/O8cGEU9kPEx8Xcd2VLlElifcoKrfRFDZmsn6+I1NpnWdCrq+5KcmkME0bgRdi+nI4QY/8UtGT9dfdfKuicxB1/CqPKET101k1pHDr+/q8PbKzyRG6sjhBmc/L7IEtU803RNJ3wDIBpwCDsWmQBcq2ZzXsjcA3Pqb8vcr73BgJG4Kz0JqkPaOemq7GuiyI5TnTWJKeRX5EbUMI0G/wwWRrYkCcNC6Oh90bxo/zoc5jWIU8MnITaPIHkZ83vcBv3FdNddPoq98EubgFefzeo60GuZ8iCsjTWcmEP4vANmC7onXcEAlm6msQ91/JOgy23P2jVCM0rKplJZNNR46EvQ7XBDZmuh0O2hdnQ+6N40f58OcRjEK+GTkplFkDyM+7/uA37hu+tT7fNKNCJ+EOXjF+byeI62GOR/iykjTmQlcfwTQtsU/SqD7woBbvzRdZ5vbtWh80DKZQKaX4YJfnZjQNaHpZ7zJ+vuVyaSfX/4m8CKr6HM2+YvG+V3/bCAb/IfS/7LFPxtrFQTNoO1gKO1vuNffLz5pvhJETWNKV5fH+R4rhyvXuI2XrfFIsL+g1zUb62+iK1P+OrZu4itB6NSPXZj6SdCyBqF/tz7Dva8Isq5X1RN+47/fvl5oeJ2T877rAYBl+f+Oqez7DrITkfTrESL+urzStHT66SItlx84k5Vfh3Lqzu2+X7peaLqtn4nt+LEzv31F/dy+h2MCk/X2IqvJd390kRlodBKzyMdNZDLxfZU8Iv6yQiIIm1LRUM1Pd7yurM71U8WK4fa/dB5IQ6fwUW0EVK/hmsgZ1PrpQrR+2Xia4NS9DCa6MvEVnU2diQwmOcVkbXTnb5o7sqF/E/jlH/T66Y6X2ZhXPkFsstP8dXPbUK6/W52WraeUOrlGxtutr9+6wk8NnY2a1pSuCqb2ayqr33hpUn+Y1nWZ7V5rNRmGolaUjTGl6bx/zgGA10LYSUME09eh/G5qM+czEk6qnckqSEcbSa+WQPBFsJttZOsJiA68BHXdTYgXBKkPZ4BRya4q4r3w9zMf0zhzPqyNSSxUzS/Ig0wd/m7jTfKETpHoZ35++5uur2p8ttcvm3DmWz8FjtfxbvLo8HK7NrVVHRmGci1NDx9U0DnYP19sVQdBb7K81rFeYZIrVE+qTTbraXrDCVVcdULk+0HXVUM53sT/dWJlkA9Wg94DDLVvDTX81lVOnHMA4HdTKntyo3qKIzu90enrNjZzPiJaunR1T29FtGQnVUGdCpvq2O/6eOmbhl9ndbPV4ZyPDmR0VcEtSH8Z6fNJx5Eg5hPEWNEBh8n6mBwwuNE1ORXXlcmkb5BjZWsrQ7Z82O/cdecjopse76c48xr7VEWU6Xwy862feGwa+7zKrJJBtLa6MqnylBeZ/Iz1Wp+l4WanQfpwULrQlUlnPjK6zvXNRo3l94DdlI/MRvz4pReZdPqa+J4pHd090VD5tF8ZZHWEjh3r2KIfuzalo1sXDcV8VMh27BPVEaLrUOaFl6QpKlpkC+Wm+LTwboVIpmHqKMxtPrICx03G9BgnLd1DAKczidp0koVqPk66JsYp6++2PjI6Mrnc/rr1Ud3LbHMmo7QcMt24yewGk/noQmUTTpqqTYFK/kz9qHzPyVskn+l8nDwz5yNbD924orM+bnzcdCODTiwJYj4iWrJxJrFEp00kg2w+Kn+RFRZBHGzotMk2pKbzyfwrsi+3caZPoGR8RPK5yaA6nMjs79SRbsGoklkWg9yu3dpE8UzU3/lZlXt15uM2TmdtRethmkd05+Ps6yaLrFg0yT1OGUxrEB2ZdWmZxHWQ1wY6daxzDVVxUySDqN3L+qhkdqOnm5e9bIZFfGQxWCRD5rWsntGBru2p6nKRDanygGxt3XirIIr7IsjijzMn+NnPiPKLs59MhvS1LlT7Fz/1f1DzkfWX+aUqZqnyZfo6JFOuqkh2M/z0BDP/Ose4KUHUX8Tbycetv1sykDmyGzJpyeRx0tQNZk76Jm0q+rpG70bfbT6iNhmtTBlEfEQBxK1gV9EStXnZZKhomRYqovno+IsbP5EPZY5TBQ03uUSyO3ma+p6zjxM6iU5ESxSDZHRMk4lzPm5JWieWOD9nwi0+pXnLaIt8XeQvshghkkc2H9U9VRJ305+JL6TbTQoVXd9w8tPxR5nsmX11CjSd+ThpqXKvTs6WFTqqWKKb/zLpimKJrA4xKagy+6tyo5uvO30ws80tPuogPdaNt+54t89OOrLY5RyvW2eI8r+pDlSQbUJEeck5TgYdP5blOudn0SZIxtsklmS269ZlMn46Pqui60Zfp/7XiX86/FT3dOmKNl1ueUOnDjTJkW5tojirWmOdeiHd1zQmZI5XxXjdukxXh6axRWRnprHBLSf6mY/Ivkz0ZbK/FCHiNjndwSJj9eo0sgmbyCFr0y3knElZB3bKprGx0WjMKEYxilGMYhSjGMUoRjGKUYxCD5FIhDFjxgjbRXs41UFVJmT7V90DG2e77t5SdPgjoyGTwXk/YrLhV0GXqRcaor6qJznZvj5LnpBFVVWVtvyjGMUoRjGKUYxiFKMYxShGMYqhhemD7qGiNRQ8In6FyYTJSYpXyJ7ou716Jevvdm3CT6f/UCMIHQ8VsiHrcM7f5LBoqGQYSr4gfptIR64gZB9J6z+SZQhaVtX6DxV+W9df5m86vuhHdtXrkEOBkcR7KOogJz0Yft8bToykOfv1PS9zGUn2P5y8h9r3hpr+cPM7nxF03huJMJ3PWf8LgMl36dwg+15Cul0Gr9/vENHPDMK6CGIDYtLm5/tyou/gZZO/Hxqq9QqCVzYKKxP+TlmCXl9Vf7cAZ8IrqLXUOThzo+GVv4yPqH/Q/uilaPPbX9ensu17zlfShsP203xlNPzIpOLvnPNQxlYnZG/2idbGLy8T+w9CN24yDCV/N5tzux4pvuc3tprAlL9fntmo27Lle279M3npHuDKaJiM9QJdebMVA2W+N5L2IKZ0s5WfTJEteYeiDhNB5HsyDMWeLUj+pnHwrAMAL6cjzoLHTxFguhhuG3zZIptucnRkEPHy0t/ZN2gn8OIAQdIYSl5BwJS/X3mD8gfRPZ3A4WcDqctLRj/IYiITotgWRHGui2yuryp26BzA6PIaCmQrVmRrDm7+Y+oPbv2zfaCZvu/cRHqlo3tfVqibHmyLIDqM8VKnBO17MgSx5ia271dev/yD4ukHQxkrgnhwY2KPqrGmh5aZ/hBUPSyLd0H7j07e09WJLq9s5x0dGYKma9Ivs79pLTmcCFo2P/vDdH/TPbkMIVXyMjm1dXsCohJAxk+VtDOdS+ekJLNIc8rmJodbu9fCQSa/qF02F512lSH8NrR73bCp7CMo+TI/+0nM2aBvwlMnFviBqS/pyqoTCzLv6cQaUbusaFLFGlNb0NGPCX0v7dmm77XdDdnmr5JlKGKByH90fNXE5nRjgdcDQ9287XYYo1PvmK6F6SG+37rDy3gT+f3Y+kgbL6MjoxEUf1Nf9WJ/Knoq+f0eCDjHeqkLdP3TScfL/DN5OWVx5nk3/bj1d+Ons/YquzRtd5uPH/mD4O+ESP9B83e7VmEo5i+TTTVeFqvT93QP52zbxrIzerklm2xCxU9kvKb3Re2q/iq097dT9ndlp69Lc0tp+26bZ3ppmUD8xC7otfFK08u4TIMcChvTteeg9JqN9Qman5/1Bm+v2uqeUgfhm15jg1cMJb/hiM9DtXYjLffIxg1VvNQZF6T9jdTYEBSGkl+287ibz4n4mdAZieOGOjakef422bPXOOOHrk6b6IDCC00vcn5S6oah9FXRumWLH4y8mkg1TteGs712p78CkB7g5mxpJZucpoj6ZtJz8pOddsjui4zAeULibJctgEp2E5icAmXqRKQP01MlWZvO5tjtsxejdLMvJy8d/fo95XOOk52Aq3j7hR9eogQio+cnwJroSSajqF8QehedkKpigw5kJ7KqWCOjacJLFQOCjg06Y3Tjqgwq2/Lr40FApYts5AZVjtLNkX54ycakecnyuAh+nmzqton4eeWlI4OzlspGbHBClVtl42S8ZOO8rIkq/5uOkY3zOibozctwxQa/91W8vOQGXT9It+nkOxlN3TmLYoNXeqo2VY0vg2ke8kpTJzY4x+v4apCxQVcuE3rZqPFFNZJqvbz4nUn8On0AICsknM6oI4zsdMukaNGBjuxuECV+r/RM5fPaFjQ9GWTG6NVR/OpXd8OhoicqYvzo1ySwqBxVRc+LfCbIhnwyZMN2g/JlndgVZGw4H2KNDH43VUEcKujYryn8xBqT+07ZvRR1urycbV438Dp8dOk55cmmLnRszcthbGabl9xpYmteNmMyXjobNa/0VPIFmZO9jAlyrdJtIz2We4kNsvyvu6HWhchfnbr1exioktGvboOol7Jpa6a+J+ozUuqkod5DeYldpvoIkp7yNwBkcCuwZPRUm3HTUxnVKb6fU95sPBUwHevnlMpMHzapVOpku22TStmc/Oj9KYmX9TLpr9Ou019WgJ9Egu7uTvriCWQcVCdvpk8VdOjJ7umsvzf7PGMrssLc79qY+KaoT7qfX1uFc5O47GRZh55qjIn+gvAlL/R0iwbVBs45JqjYNpT0TGKVSVu6PchcpZJPZwNswsNvXjcpoLNRJ4C4iHejp7NWJnFd1u4373ihJ7unQy8bsd6rfDq0/crn7K9jb7q51EvuUPmXia+rHgKY6M80j4nk0eXtHKO7Nrry6NDzclAmuufFN/1gKOoOv3nTLz1T31PlKr+xyA89N/lDzk4mBunmXH5O+ExPXlRPDLzSc3NMv6eMqoTqZkgm8icTcZIpeREnpBdvYePH++lMJGGwg421B6jtHjDWn7OIlCUaN/3Kba2D3Xs+oHHAdQIcr91EXW9cON7JU83PIhnv4cDHL/MPL/8vvr/mOfa19p9q7ebA/vXU9SbP6u/mO86CT6YjkaxOmqKxmfcsy6KlcSfvHWsiIZDPjZ9t29BzlBf2fcyAW/9EB9sP76ep71z7kJ3SO+UX8SeVJJlMcdqU+5tZdaSWtoGEUHY3mpnz1YlJJsFTZvtpvrLEoEPPOVZGz9muY9smcV039ooKAt2nA6p2GT0d/Yp07mz3mjtkm7ugcpHOhtNEv6oNqYim6nBFtw7QsW0TuiZ1Qvpa5c869LzqUYefrF0Ub0TyqeTxqg8T31TVRW62rxuvVLZtWsfJ1lN3g+mkpxMLnDowqsNTCbrbTrBv7072NvaSOVRVh4nu+ekvygvOuZnmHRWCWhs/cf1ke4retuNs37KZtR9+xKa9dXQMpJS2L+Ola9umsVRXZ7p7JN08JsKZMQnajx3igw83subDLew80sxAUjo0ENtW0de1fdF6+K07nfxM2i3LIuSlWDCBKoDKrnXGyHh6PeHyq2gvvFSJAgkXawAAIABJREFUX3R9EgMc2P5DVh0R/wChVOb+Bt7YspkTg3Hob+LlPRvZ0d57znjVpsY00euc5p7pc4y33vkVH/e5OYRNMjlI0nC5Vet4bNeveXJbA2MnT6eUel5c9XN2dQA08/6aX7KtQ7wpTdM30ZFsQ+/WXxXgave9wX/sOsSgRL5M3qeDdMt2/ufqdXQ7+tu2DYNNrN6xmdruPgFVOVSbmcGWHTyycR0NvaektlMMJpNnvX1huikwkckrDy/Jww8/P76oQ98LVDz8PnEwyUVeihsTnegWaH4h2mDqbjh16csgy0HZsCMdmDzJCbpuCaK/n/Eq23Pr70c+neLdpM7Tbfcqs9/DGF0Mhe0760OdOF639R2eee1dXnr1Vd7Y26bsbwpdfzqrpnCRYbhihwymti0bn55/f3sj69esZ8fRdvr6uzm8cwOrNh2gI27O09S2g8pDIvqydlmeUB1WnH1t03lkF6+9t43j3f30dp1g8/vr2HC41ajm97oHkY3XpScaqzoEUNVQfn3onDcAVPBrULpGEQTvkRhgnDAtZN0TcZzGulfZ3dLjXx4DWc4Z63N9dA4ZwE2GGBMvuIIpBVEj/nJ0sGvXJuYt+R0euvT3+OpVX2FpQR0vHDiuTeF8slfVaebp03ofPHQ2rfHuOt46tIe2wVOHK3ljWTF1GmWxsJSWX3mC1v1Q+IqMnhf9+NGpDv9sHJzqymOKdPHmlX/QGIoDHBWCOnRwwu+TF9PDMLcxw42gC1HRWC/8/dqel4140IWuKc43+8hExZS5XHP11Sy/cDy5EX95xvmU3uQwSVVTiHjK4HyiaopsxHVRHWFZFhZJTtQfpDFZzdXXL2PF1VexcsmF9J84QF2T+UMU00P14a4pvfQ7Z06JTnbsOEbejLl8avmVrLhmOSsuymfLzloGEyn52IBk9EpPZ71MahlTeVV1WUQ12E/icYMfGn75ez0J93uCnolUoocDu17jlx89xVuDR5me/1nuu/Jurpg0nihd7N72PL/Y/BRrE33MLvgc9117N4vHlRI9/BxLPgzxLxMO86N9z3E0MY3PLPgOD84fw5oN/5e/2Ps+Rw9+no1N/5u/ufFy9r/4f9lffSWD+5/h8NhP8V+u+DShhnf52aqHeTN+grHR6/mdKx9g5fSJ5JycJeDYXtsp+rsO8977P+PR2reps+Zz76yHuHPxPMrqn2XxhxH+cewu/qU+xNdW/B7XjSs7Mz7Rw7aPfsmPtj7L9pTFjKK7+ManPs/C8lya6zfyzPqf8XzbDghdye8s+DK3L5hJYRi6m3fz8vs/4Znj62m0ZvH5i77GFy6dR1UuJJN97N/5DK8e+Dlv96ZYVv11vn3TLVTmdPPus39Dz+V/xi3j+3n3zVdoKimn+/CLPNa6nzH5t/IH19zL0okV2PF2tm98ih/sfJJ9oSncM/kzdCXghgXLmVtdfNZaDdqFlOXnEA6BFSpk3sK7yenKAfqBFPW17/APb/+UF7ramFTwOf73Zx5gcmGYvtZ9vLn2lzzc8BZdoVncNP1+7r3sMqpyQ3Q1buPZtY/waMsmimPL+fycL3PrvAspiYVoa/iQJ955hF937yCVms3vXvYtbp9zMYV0sX/bS/zLpkfZTJJZhbfx1Wu+xOJxpdjxTnZu+TWP7niONfE2FpR9kS9fcScLx48BEnS17uaZV57hF8dWU2bdyL3Lv8GNF1QQtRLU7nyen214nHcG2xgTuZrfX/HHXD2pmAhgp9pZt/qfeHLPqzQymy8u+j3uXXDRKVtJ20eSnrZ9/GbtI/yiYS0dkWt4YN7vcuv8iyiKJDm88zl+tvEJ3h1spyp6LV9f8U2W1RQTsQdpOvwO/+/tf2d1spWy6AoeuPp+lhYf4Pu/+RZvtsbZ89Qj/O1N67k5bxP3rz/Kd5atZFZJjK6Wfby5/jEeb3iXZmsWd1z4IJ9bspBxMZt1r/wJH+bcQEHHc/yqrY7pxV/k69ffxSWV+dDbyLOv/TWPtWymm+l8esZXue+KyymNefPjIJ8eucUXt6duMp5BbBB1Nwqqp+tBzMcvhnp9gubvFdnQq98ndrKnWTrFTzZ0OZLWZ6h9ww2iTbgXWYOQ30uhG+ST5eFeDydM1qegfBwFQOhgLhEXsU038W5/TeHV10V7kKBjkR9IH5wkk3Q0Hydn4jLG50XAtimqmsDY3BO0tHeSGJ9HZBj3RKfl9OjH2cw3aaS6Wqm3I8weX0Vu2AI7RtWMaRRuPEhjIsmUaOicsSNhr+cGr3VZUHI5aZzzBoDqtMHkhMX5Oozzc+ZpXBBPrLw8BRP1cbvvV15I0XliC6/sPcySa37AOw+u4m8vn83uPe+wt22Qjvrf8Msdzdxx4y9456HX+MvF43hz7WNsa4sDNr0dW2gqvZ1/v+9dXrnj67Rs/yEb+ypZedWf87cXLeW7y57mJzeuYKwNtl3Httpubvj0D/mbFXdS1fcB/776fRYt/yGvf+VtHrnhWnZs+CmrT6S/VH/uWqcSPWzY8hhbUpfx9196hzfv/g4V7W/y7sdNJOwUvZ3bYfJDPP6l77FiXBlWhk46a5/l5/vD/MGdL7D6K8/zl/PDPP/uOjp66nh71y4mzPkzXvrKKp68+Taa69ax+0QXycEOPtz2PE0ld/Lwfat46+4/Z0rfWtbsrSUODMabaUyO55uff551X/43Fg08zqN7OrBtSNknXxO3bZuUfYQt+w+y5Lp/4s0Hn+PPp3fxqy1b6E8maK57n3eOp/jqHb/m7ft+wPLyRjYeP3T6dfcz61rCzOkVfPDhi6w+sI+2vjiF5bNZPKWMk106ONCS4K47HuO9B37B18rW8S9bmiDZyaYtq2ipuounvrKW1+76HtVtm9jY0IAd7+SjAzuxpnyTlx98n6c+/4dMj9RT35kAOljz3uN0X/htnr5/La/c82fkHHmCVw5103XkNR47UsCf/s4rrH3gWb43vYfHN+8kRZKmI6v5dV0fd9z8KGsffI3vzqpg3a4PON6TALuX4z2tzJj/PV594H3+auFktu58iiP9wMARXtv4MStv+iVvP/QbfrriUt5e9SRH098XGNhHV8Xn+emDb/DibfdwYssPWN2SOusNgER/I+9ufJrDhbfxyH2r+fXtXyTZ8C4b69pJ9B/mjY8Oc+PNj/HOV9/gx9dewjurn6Z+EBItm/jhmrUs/9SjvPmV3/Af113J9nUv0lVyNd9d+U+smPxn/Oqut7l5EtjYJE/9KGW89xhvbniWhtLb+Pf7VvHKXf+NsV3v8vqunfQlbfoHWtjR1cfV1/4zbz/4HA9UneD1LWvpSELXnsfZUPQ1HntgFW/e/6/cUHiQvR3iL5GJ/F/WbkIrE25PM02f2pnIq4rFurKKaKkOCEQwkVf22S+P9LXJfFT8vb6hYTJHUZGgsg23+6JcZzJP1Tjdp4O6T+382LWOvKK+Xtoz+3g9vAsyHon82HnfZD105TWxTxFdNxsQ0TK1B6ce3Pp4qwf91cWyDZtqnGnda/LZ7Z6uXKo+qnbZWrvpNQgfkueRFL2D/eSX5J+usK1YlPxQioHBfpISvn7jmYiW232vNYiIR5D6HRgcxIqFiOVEsU7JZRXkU9LXSYdAH7I3xGTymsppQstLrBCthW7cUK2hpx8B1FGWsxgRneJlfhY5r0hxqsSp8zqG01CcQT+zj8nbEK56SSVoaDtGXsVirqoZQzQcpmrKMlbOv4rKHJujO39F8awvc+n4UiJWhMppK7m2ymJnXTMpIBaaxpI5U8gNQ87Yhaws/YgG4df+jzGhZjFTiiLYtk3jnqfom/wFVkyrJGKFKBi/jC/NKuf9vfWItkGDg80caWhjyfwVjCuIEiuYwLzpi7C6aukFYtELmXlBJekDuDM66Wff3q3MXHA7F5flQDiXmtmf5765k7AjxSyacy1XTZ1AJBSmpOoiLi6vhngvAwMtNLcPsGT2EkpzwkQLJnDNZXeypLoQG8jJKWfJzCuozAtD7iQumbqELe0tZC7Fyc+D1Ey9igvL8iBSzMyayzgwECeR6KO2rYuKcZdxcUURoXAuMyYtprqsjAHOtYepC+7l+okxmo5s4Zm3/okndh1l8DSPHC6ds4KJ+WGIVXH59GWsb20CO8r4GTdy8+yLiIVCxIqnsbQqh4H+HmzbImQlGBzsZiCZJFowniXzrmVmeQR6drOpfz5fmDeDoihEiidzw7J7uajYJlQ8k3uuXMb4PCBSyAXTlzHQH4dkDwdaO5lWcymXjC0iFMllyoUruf7ieRRFbaCQqeOXMHt8GZEQjKuZy0xrJ529NpDPkqu+zOKqPEJWmMKaFVwT20P6rTQrtoiVsyYStWzyqhZy3wyLJ/ecOOuYqLvrKCe6w1w153JKcyIUlM1g7vipDPQ2ELcKufSq32XR2DxCRCiuuY5lsX0090PToRcYHH8r19cUEg5FqZh8NQ9cOZ+Yw2Vs23bwO0bnYCFXzVpEWSxMTtEUbp09i/bWY7T1J+m2iikcP48LK/IJh3OYPv0ypg3W0xUHQhZRu4vegSRE8rlo0d0sLhf5zrnFiNvmykscVBWjorii2oSqErjpZ1XsVY03hWjzmqbrjMUyObzycF6r1s2twHXjmdkuuhbBRL9ebcc5D6eMbvdU9iDTtWy8CJkyiP46dZWWQSSzru+Z9pW166ynSk6Vf6f7mGx0TXzPi8+b+q5JzFSNC8L3VH2CeCItqpF156+7LrKcJDoccJPBLS6oeOjq3imPjoxOOdz2IM71cosZznm4yataNx35TnVUroXI91QQ5SdV3vJSB6hoqeogHVpe+5rGYi+xR2RHIp82pe/sI+NhUnNGnA1uhZDIAE2DuqooUNHS2XT7KULd5u6VvttCYNv09fYzGCsl99RXmq1IATPGFwBxDvQcYnJJ2elTmVAoTH5RBf29rcSLwYrkZryCHSYUGoCzvwJzivfJv/mR0KnrJO29h5lSUUw4o0NB+UTiR4/TT5HrHJKpE2w9+iR/+8Ja8k9ZymD/WG6Y/z2WA1Y4hvu37vtp74sytjjz/ep8LrjoYgBi0UaefeNbPHFiI00M0DVwBX89ZREz7R4GkwUU50ZOyR2iuHQ8J1/MbyVkFZCTQdIK5TJoux1f5JCT8Z3xkBVlgAFIDFLX3UdbxVjyQ2BhEQ5HCUdyT/E7e20jsTIWzLmZi/s6ON5xkFWr/oGfpv6E35t7cj65sTMJJRzOZcBOQaSAaeWtvPf+3/P7h1+ijhQD3cV86drlEC3iktnXU7hvG798/nHqcmdy9+K7WDC+ELpaORGtoiRjfsXl05lv21jWDIp3/YbvvvTvvJdqgmQPddE/5fvJeXT1p6CkkFNLjR0tYV5NaVpBRMKxM6+YWRCyBsG2IKeaqeE3+P7j3+K1noN0A0X2VfxNmnk4TOi0TsJUjZnLzgOt2KQFtBlM1PPh4R/zz00vnLJnm/7eKdxz9X/n6pxqJltv8E+/+iPe6D1Et21RGlrOX5Oks6+e8QV5GZoOUzVtKQCZv2Jx9nrYDCb7CIcLKTptHxaF+VXs7m+kOxGHUOjkemYW/6EUtg3FF93D58ObePn1v2Df4BiuvuQL3Hhh9RnqAt+WxR6dgsuZAFUxRiWPCF6LBJEcskIpCKj0oKMnU5l0dR/kWC/zEsGPTcigslE3OU2LLtm1bl2gslHRONm83CCqg0z6m9KX8fJiM0HSH+m+p1uDBilD0JDFb1VN7oe+ac3vlGko8p7JxlI1TtRfJadp7PBqL1nfg7jQ1JFH1zZF9/3IMJQISu5s1gfOtXDanInMZx0AmDiSivBof5f+lkU0J0a0b4BEitPvX6RSKSwrTF6shJb+fmxysTi5sInBQXJyiuQ/1oBFSCpbmPxoKS39g2SwJd7XTST/InJw/+/zQlYFiyY9xF0r/owFJWn6FpYVInTwaQm/KPnRFM2DZ2/O7WSSvqbN/PC9lxl78R/xzM2TiFgtvLNuA6WAZeUSDcdP/bBHekdrk7JtLOOfq3SBZVEctskd6CVuQ44Ftp3CdjtE6NrGEztyuXPpheTklzE5fyHLF3zMo4dq6ZlbfW7/NHqP/P/tnXlsHNd5wH8ze3IP7i5JiaTES6okS7It25Ily05iO0iNJBYSoHFTFEVaBChQFAGKIEUTwyjQJAiapAeKAi3aBEWNpDkK23XSulaDxPGVGLUdu/Ih27JliRLF1ZIUl+Tucpd7z/QPmtZqNMebYw86/v4hZ977jve973pv3szyg8e/x2Lqw3znD75E2A/nnr+fk0FAkon1b+emm7dz46GPUVo5yQ+f+HtmD36OY4NRYso7P23i2xi6iqo2mXnhW/zNdD9f+NSDfL0/CPkX+OKTVSTZRyjgQ27W1382T1q3uXV7srDV7FP8xU+f4beP/SOfH0kgywpP/fi+y+0qVxz3r1WXiPr9LU/kJfy+bXxo95/xJ3f8MXtil+1DlmTUS09w32PP8um7/4kvjPYjqXWefuQrgEw40E+pfqXNqWoTRfEhSTKSwbdJ/VIISW21D5VafZVdoSAR35UecuXwVQgNccN1H+XAtXehVrL8/Pif8tfVb/Gl6+Pv9O/x2OFx//dh88F71Ya6Na7NUte8D+992Cw+0Gu+0W492IWrFl+yTDwS58JinubuGD5ALZcpNCHaF7X9/v+vY6wJ9/UhV5qU1iqog0EkQFnJsRgf4KjsxcJgc4MbmzDUntERMrtH99yCHX6dls0KrpJH9jGc2kIze4KTi6s0FZVaKcv5i+fJVRTGd32G86ce4czKGoraJL/wCi+mM4yPbLX4uYYgiWCEfMXoq6IS23/jd1ia/hknLxVoqArVldM89tpr7J4aN9xcCASG2JKUefPcOapNGR8SpXyWlUJZ91v8lyHKrqlhTpx8jkypDijUi2lePbdAsV5iJDHC4fExgjLkF2d4O7tIGQgFBuiPVHnpzNuU6gpqs8LC/DQXlot6Bx3sQyDC5ECCtYX/48JqBaVZY27xTTKFLKCxeZ+fmTcf4n/nctQVoF5gNn0KKZIw34yplVgK7uHmnfuJ+mWquXnOZLOUmqA2KmQyp0nnayD5CAeT9EdirFaKKIm9HOJ5fjY9T6UJNOsszL7KhUKZQjnA4b2HmUz0QW2VdHqa5WoFfH3sSIaYy7zMmVwFVVWo5DOcyVxkrW6hscIcxdFPcmhkkCA1lmbf4mwFNpb9ajPN6bk8DRUaxYv85HSaz+6avIJEtG+YWLDM6XSGpirjUxXyK1kKpSrq6gJr2z7BwZEBAmqNbPotzlYBJEbGjzGffpY3lioogFJd5vWZc6zVIRDsJyL7qaha+SVi0S1ILPLi9BlKDYV6eZFn3n6VoXiURMhsVpoUL77MGytlkHz4AhEmBkd4bWVZt7do3LOKNyLH5toForJ5xcOMnl4ucXL0rV3QCd52efSSfjoFTmy2V+ym1de99i0n/XrZXrrlb5tJV70oE3Q+p3Uij9kBuzYkyX6Sg8PUMm9zPl9FURpk0+e5VFYYTMXx6WK5l8er/u0GkXgpRVNMhpqcmp5lta6g1IucO3UWZesAAz7xDQDR4/WdBCt/arc8V1XNRu/0bIDVboMVvhVo8e0eV/Gavxv8q2n4GBy6ngPD5/n5L7/JD8NFJsMf4LaJgwz5/MR3f5xj8w/wwONfZjGskCgPs2/vPdwyEkaaMeMaYGLHJ1l89h/4SvMwn7nhU1f1CI3fyWf3PMT/PPkNvhutECqnGNt2D78/FYU1far+YIwD197N0iuP8ncXZ8nKg9wQv4MP7z/EkE7/0uzL/Gp1gjv3pdi65/e4c/77fPunT5AP9bGr7wjX7zjK/oEpRkMn+MGTX6QY2srB6DU061XqzTq+0BA37b+LR1/6d/4ys0zFv4fbtnyAQ7tGXQfKDT1NThxkb+Y/+e5j91IKj3BQGqIhrb8CUCtlOX1qntED1zEU2c0nrh/gv5/+W/4ruoSkpBhWdnLs9p2EmDNmEd3G0dRLPP7cl3kwnGR36AiD1SzFyvrHFhtrCzxz8ie81JimVhtiZ9+NfHxsGL8U4rbDR/n+iX/mz9/MEfDv5TeHb2TfYJSJnft4/oUHuDd9P1HfAW7pa+CvRigRZPv4YfbOHedHT36Vb4ca7Ok7ypEdRxiXLTQ2fCu3vvgvfO349yCwh4OxA8hShlJ1/af+tsZT5E/9iG+eeJVsxc9g/B4+tyMM1cskQrFRbr7mNp5+4yG+MX2BgjzOTYk7+Mi1B+gfPsqRE//KV4//G3LgGm6K7n+HPoRGP8gf7s7w8ONfYyVaYUvgEDeMHmHPFAQGJvhY7Bm+84v7OLHrPv5ouIVffILbr7udx04+zNdn5yg2EmwN3sjd191EzHRXxo/MKq+8cD8PNs6y2gwxUBnj8x/Zpttb73ihk2OwTmKYVyAqm1c8zOiJ6K6bTyo6wdvtk5tO6kfvHUKnx43tgBObNTrOK0LPCOy+OtH6f2sN4hTsHvN1g++WvxN8kRqyHfxFa9pe11878UXrf6P2Ttf/enPnJX8rftr7V+FLMlvGd7Er/RxPP/ooz/hVmqqfqf03Mz4QuoqOXfmtxq+1hU6v3/TazeTRxffF2HfjbhZ++Qr/8fBb+NQGTX+So7dOEfTL1vgGvMzG0Kn1o95xfr37beOvCmQrM4W0MtQrHMyEcapoK3mMjN9reXKVHKm/Sr17nQwnWbn3yq/yXU1TpVHJM5e/yEKjTCw0zkRiC5GADKpKrZojk5tlqdkgEhhlamCUPj9QXea1Vdg7NPDurk1x+XVqkWsZCAP1EheWpsnJUXYkJ6F0hrXgDoajl18qV+ol5pbPsdCo4vcNMTUwRn/QB801MrkyA8kUIbXGxWKJWCRBMugHpUGxOM9scYGSGmJrdJLR/jiB2jKvFa+Up1FaZqkRZTixHtjq5UXOr6TJqz4S4XEmU0mCskKltMhMPkORECPR7fSpTXzhGP3hEDSr5AoZLq4tUZWSjCcmGIoGkSmzsHCJyOAk8XcYVkqXSDf72dUfoLCcQYltIxlUKOQXqfqTDEYiyBJQK/BmUWF3MoFPVqmWlrhQSFNQwwwV53jwrVnuuvXTXJ+QWS1UCCfXv9HQbKyxuPwKj/zqefrHbuaDOw+xLR5GlmpkF+fxJ8ZJBt8JQJUsr5f7uDYVpVFeJp2fIdv0k+obY4uvSNmXYms0htook83Pkq7mUaUEY/EJtsTDyIDSrLK8MkO6WkCVk+xITZEM+0GpsbxynvOVVfy+rUzE4xTKCqODKfywzq+QIduskwpPMJYYIOyXKa3OM6/EmEqsHz1rNkrkVy8Riu0gGoDCyllm1lZoyCm29Y8Rrp5HjV1DUs1xdk1mVM5zrniJqhRle2Lnui01KywUSkRjCWIBPyh18oUM6bVFKsQYiY0zHIvik1RWc2eZWcvRkFNs7x8jVJ2B2B4SQVAbJdLZaRabNUL+UaYGhon4ZSRJYa0wx7niAsHIPnZHVaaLNUbjCfr8Mig18oU5ZkuLVKUYo/Fxtsai+FDI5WZZDYwwEQsBKvVakcJahVj/FoJSnfzyBS5UctQJMRiZZCIZe/fVmU7FLjPoZOyyK49e2/vyvDfkcVv0OQUjebsljxlYzVc75vN9ed6Xxw1UV5cpEGMoFkRL2qk83dJrr8ljxg+0sUuhtlZkaaVAuaES7IszOJCgT+83Gjsiz5XtvRL3zdualPM5LuXXaCITiScZTEQIyO5ldyZPZ8BuHWgXJEVRVL1da6OdGV0iBvjazQGv8J3Qs2rTU7IVfr6a190AcPIEwM2TA6e42l2nTvD0gq9TXACpWWF+4SLLSpEKNd46+Qty/Uf43Vs+RNL8QwsgSdAFPW+AHZtv3ZBr/WvUX4SmXZnt+qARrpXs2ljhFF9UV3rXRuMViVVGuKL4bnTlNK7q6UoU3ywGW8nTjTjplobVuL3m5wVut/i71RW4OzbZ7vGa1Voi49aLdRu4evTtxkrR8Yjo2m6tJRpn9fiKxlkjmb2O015dd6JW6mQ+FJW7G/WsU9wN/G6Mt5djnde4VnHSbgxwUytZ8XODayWL6LUW9Pr7NzrqIWgFEoHWfkb/i9I3wzej1xo4RXmJtFspWK/NSha7shnJZBfPKc/W8WjxOjVWJ7iXidTJ5V/l+LmnmFZi3DB8jN+67iipgCA9h7paR3W3a2elbyMfMZovK3lE59Oonx0fFB2LyLWePKLXoroSHa+oDrUFnxVdM/pG13qxwqyvaEx2GudFxmpXHxvgRJei4ISGaJ61mk/tokBU33Zis97GjlV/PVmNcEXzs9O58jrOeo1r1MdNLSbq02btdmRtbTebT7NaSpKsvw5vRN+Nb+vlHlF8O7qyq3eza7f1rt2a2EntIGpXduKWU7Ab68zwtH2MYnCnanAv8LzA78aaoxXXbszR66P1DSsftJMb7dY6YG5PTmpSbbuWvtArAHrCibZbFSxm7UZKdkNTZByiIPIKgBm0W59e8exlsFMQ96K+exna4WebxX7d0vE6ForI1Mv6tIJe9M1e9vdO52KRdrcytwvXC/rdyAObxdascHolLvVKLu7FON4rttQO3TjB70X7bQefXsm7m0Wfbmn2mj5d/4ZC6/6B1S6HaHvrwt8Mx2iQdni2gtVeiI29EiFwYmhOx+ZVuxa81old3lb6aAUn7W6DgdtFZK+AV35mhGO02SdC0057p8AqINvVp0hichLrNqs+tfe8joUiucUuTS+h3bbgRN9aeqL8RaDdcdSOLbi1C9G43ilbs5LH7UK723WKaKyzwu8UdCPuOK2JrUCL345x2PEtt3WK9p7TWGeFLwrt9iO3eVdvfG7s20rf7danFuzmFrd1oRV9u3Wdqw0ArfBaZdidDK3wVvTcTpZd+brNz4qe18FahL6dQrDb8rulp9fuZWHqdaHhRt9Wvu21LF7T67QurcCtL3c69ril32uxrtv67jV7t7NxaiUGKGffAAACrElEQVSLGe1egG5u4m4G8Hp8vaavzSZPOzYcOrVZZBff6zxhxc8utDuPes2v1/JQt9dMdun/utV1phsArcT1FjtW13bBLT09ZRidUNAeu2htN1KqE+OwOiGhpW/GQ08/TgKEdl5F5bOrHyP9irabgRN7dOvcovJZLay19ET1Y5ePKH0Rek7AzLbsjrUd9Ixou7Ut0V1hO74nwkck1mnbncy5ET2z8YjOqxG+F7nFrb6199tpj1pedvWtxXfKW0vDjJdIcWJ1z4sY5JZeu4tmkbjuhdztgnZvJorwMbMju/Ts1l3tBi/ysl3dae+L1Ax6evMyj1rJu4HvJK6bQTvrFu19t2sqL9dodusWEX4i4FXdYuXHXtUt7V6jmfFza49aHQmfANCbWDsLbjMckTY9eiK7KUYBy+wJiJESRYzbyiH16Iry8Crxij79MWoTvb+hb7cbC6IyuLUfKxC1B7MkaWWjVvTM7ovatx5Yjc2J7pzYshN7bKVpNg7R+XYb60SDvlvfE02+Inzs+p5W11Z+bmY/XuUWK/A61lkVw2b0nMQ6O/rW4tvpryefCK6IPVptHuj5jt61aA71Ik+4LeJE80TrfTuFvxUfEVyrdqPc4gU/N3FLtH9ru55tO8ktouB2Ad/OWGdVM5j5opXe3Pie2SJTS89NzbBBQ1TfbusWKz+yu/noNtZpadnJYV5stmjpiM6Dkf87qTO8rtfN+ntdR1vhWMU60x8+c7IwcbqYEcHt9f5aHLcLaJF2uws9r5xWBDqh707y8zoRew1uePX6XHlB003ssRvrOjnvXoDb+ffafrxIvJ2EXsktXvHrZtyye+2WX7tw2km/nbHea9/rtN+6yQNe4nSLn5d87PqeV7oXXWR6oSc7NNode7od67qdY73m32l924Vu55X/B+o1y/xYJYkHAAAAAElFTkSuQmCC) In the past, writing an automated test suite against your application meant downloading, configuring and learning a completely separate framework. To help address this issue, CFWheels includes a small, simple, yet powerful testing framework. Whilst this has been part of the core in 1.x, it's never been properly documented, and with 2.x, we've introduced lots of new features to help test your application. Here is a simple example of unit testing a helper function that adds two numbers. [https://gist.github.com/neokoenig/11e9cd548ec1e12f688fb156364ef873](https://gist.github.com/neokoenig/11e9cd548ec1e12f688fb156364ef873) The same idea can be applied to just about any function in your application. Here are some of the things you might want to test: + +1. Global helper functions return the values expected +2. That custom model validations return error messages when a value is not valid +3. Model callbacks are fired and produce the expected result +4. Controllers produce the expected output +5. Controllers redirect to the correct location + +Once you have a comprehensive test suite, you can make code changes with a greater sense of confidence that you have not introduced bugs (regressions) into your application. This gives you the opportunity to implement automated test runners into a continuous integration platform like Jenkins or TravisCI. Don't just take our word for it.. well actually, DO take our word for it as CFWheels 2.0 has been developed exclusively against the inbuilt test framework. For those of you who have been using the testing framework in your CFWheels 1.x applications, the 2.0 framework has a number of improvements around setup, teardown and a super handy `processRequest` function: [https://gist.github.com/neokoenig/0eb9399a982d09464d925cc42902d00c](https://gist.github.com/neokoenig/0eb9399a982d09464d925cc42902d00c) You get lots of handy information back, like the `body` contents, the `status` code of the request, and more. **Want to get going? [Check the comprehensive tutorial at guides.cfwheels.org](https://guides.cfwheels.org/v2.0/docs/testing-your-application)** diff --git a/web/content/blog/posts/upcoming-previous-presentations.md b/web/content/blog/posts/upcoming-previous-presentations.md new file mode 100644 index 0000000000..d2523a3fb9 --- /dev/null +++ b/web/content/blog/posts/upcoming-previous-presentations.md @@ -0,0 +1,40 @@ +--- +title: Upcoming (and Previous) Wheels Presentations +slug: upcoming-previous-presentations +publishedAt: '2010-12-12T06:15:01.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + Thanks to the ColdFusion Community for supporting Wheels. Hat-tips to upcoming + ColdFusion Conferences cf.Objective()(http://cfobjective.com/) and + CFUnited(http://cfunited.com/) for accepting and ex... +coverImage: null +legacyId: '48' +--- + +Thanks to the ColdFusion Community for supporting Wheels. Hat-tips to upcoming ColdFusion Conferences [cf.Objective()](http://cfobjective.com/) and [CFUnited](http://cfunited.com/) for accepting and expressing interest in Wheels sessions. Individual thanks to Sean Corfield for [asking people to submit Wheels topics](http://corfield.org/blog/index.cfm/do/blog.entry/entry/CFUnited_2010__where_are_the_OO_submissions) to CFUnited and [Charlie Arehart](http://www.carehart.org/) for hosting Wheels topics on the [Online ColdFusion Meetup](http://www.meetup.com/coldfusionmeetup). + +## Upcoming + +- End of January- Intro to Wheels ORM & Validation - Online ColdFusion Meetup - [Mike Henke](https://cfwheels.org/user/profile/25) +- April 22-24, 2010 - [ColdFusion on Wheels, Inspired by Ruby on Rails](http://cfobjective.com/sessions.cfm) - cf.Objective() - Mike Henke + +## Previous + +- 01/07/2009 - [Learning the Basics of the ColdFusion on Wheels Framework](http://experts.na3.acrobat.com/p20437196) - Chris Peters - CFMeetup +- 11/25/2009 - ColdFusion on Wheels: Tour de Framework - Chris Peters - [Devon CFUG](http://www.devoncfug.org.uk/) +- 11/10/2009 - [CFWheels](http://bit.ly/3zGlrt) - Mike Henke - [MDCFUG](http://mdcfug.org/) + +## Screencasts (each under 10 minutes) + +[Screencast page](https://cfwheels.org/screencasts) [Postcast feed](http://feeds.cfwheels.org/cfwheels-screencasts) + +- [Hello World](https://cfwheels.org/screencasts/view/6) by [Peter Amiri](https://cfwheels.org/user/profile/4) +- [Creating a Social Networking Site Series](https://cfwheels.org/screencasts/series/1) (7 episodes so far) by Chris Peters + +## Call for Speakers and Audiences + +If you are interesting in presenting or have someone present for your event, please contact Wheels via the [Google Group](http://groups.google.com/group/cfwheels). The group will be glad to help. diff --git a/web/content/blog/posts/upgrade-to-0-8-1.md b/web/content/blog/posts/upgrade-to-0-8-1.md new file mode 100644 index 0000000000..e57475f5c2 --- /dev/null +++ b/web/content/blog/posts/upgrade-to-0-8-1.md @@ -0,0 +1,24 @@ +--- +title: Upgrade to Wheels 0.8.1 +slug: upgrade-to-0-8-1 +publishedAt: '2008-12-21T21:39:49.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Per Djurner +tags: [] +categories: + - Community +excerpt: >- + We just put up a bug fix release that fixes a few critical errors with the 0.8 + version: +coverImage: null +legacyId: '14' +--- + +We just put up a bug fix release that fixes a few critical errors with the 0.8 version: + +- Problem when placing application in a sub folder is now taken care of. +- An error when trying to nullify a field is now fixed. +- Missing rewrite rules for Apache are now included in the zip file again. +- Wheels now runs fine on case sensitive operating systems once again. + +You can [download it from here](https://cfwheels.org/download). Thanks to everyone who reported errors and helped us test the solutions! diff --git a/web/content/blog/posts/upgrade-to-1-1-5-today.md b/web/content/blog/posts/upgrade-to-1-1-5-today.md new file mode 100644 index 0000000000..594b997b55 --- /dev/null +++ b/web/content/blog/posts/upgrade-to-1-1-5-today.md @@ -0,0 +1,20 @@ +--- +title: Upgrade to ColdFusion on Wheels 1.1.5 Today +slug: upgrade-to-1-1-5-today +publishedAt: '2011-08-03T15:00:48.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: + - 1-1 +categories: + - Releases +excerpt: >- + We've released ColdFusion on Wheels version + 1.1.5(https://cfwheels.org/download). This release addresses some regression + issues with 1.1.4 that some of you reported involving plugins deployed in a + ... +coverImage: null +legacyId: '70' +--- + +We've released [ColdFusion on Wheels version 1.1.5](https://cfwheels.org/download). This release addresses some regression issues with 1.1.4 that some of you reported involving plugins deployed in a subfolder install of Wheels. Thanks to your help, Tony Petruzzi was able to fix this issue quickly. Wheels 1.1.5 also fixes an issue where values generated by the `select()` form helper were not being HTML-escaped. This fixes a potential security hole, so we recommend updating as soon as possible. To upgrade, simply [download the zip file](https://cfwheels.org/download) and replace the wheels folder in your application with the new wheels folder from the download. Thanks to those of you who helped report, pinpoint, and troubleshoot these issues. Your help has made the Wheels framework a better tool for everyone. diff --git a/web/content/blog/posts/version-1-1-2-released-today.md b/web/content/blog/posts/version-1-1-2-released-today.md new file mode 100644 index 0000000000..6f84543bed --- /dev/null +++ b/web/content/blog/posts/version-1-1-2-released-today.md @@ -0,0 +1,30 @@ +--- +title: ColdFusion on Wheels Version 1.1.2 Released Today +slug: version-1-1-2-released-today +publishedAt: '2011-02-01T20:19:24.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: + - 1-1 +categories: + - Releases +excerpt: >- + We're releasing ColdFusion on Wheels version 1.1.2 today, which includes + several bug fixes. Upgrade immediately(https://cfwheels.org/download) to + increase the stability of your Wheels application. ... +coverImage: null +legacyId: '64' +--- + +We're releasing ColdFusion on Wheels version 1.1.2 today, which includes several bug fixes. [Upgrade immediately](https://cfwheels.org/download) to increase the stability of your Wheels application. As with all releases in the 1.x cycle, you can upgrade by replacing the wheelsfolder in your current application with the new one from the zip file. Here is a list of issues resolved from the [CHANGELOG](https://github.com/cfwheels/cfwheels/blob/v1.1.2/wheels/CHANGELOG): + +- `select()`, `selectTag()` allow an array of structs to be passed to options +- Changed `default` argument on includeContent() to `defaultValue` +- Add `when` argument to `validate()` +- Added the `varchar_ignorecase` type to the H2 adapter +- Fix so that the full table name is always retuned +- Pagination with `parameterize` set to `false` for numeric keys +- Blank should be the selected value when `includeBlank` is set in `select()` +- `validatesLengthOf()` failed when both maximum and minimum were specified + +Thanks everyone for your support. Please continue to share your experiences in the [Google Group](http://groups.google.com/group/cfwheels) and submit issues and feature requests to the [issue tracker](http://code.google.com/p/cfwheels/issues/list). diff --git a/web/content/blog/posts/version-1-1-is-here.md b/web/content/blog/posts/version-1-1-is-here.md new file mode 100644 index 0000000000..bfb04fc38b --- /dev/null +++ b/web/content/blog/posts/version-1-1-is-here.md @@ -0,0 +1,41 @@ +--- +title: 'The Best CF Framework Got Even Better: Wheels Version 1.1 Is Here!' +slug: version-1-1-is-here +publishedAt: '2010-12-09T18:00:33.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + After nearly a year of coding countless bug fixes and building some top-notch + new features, we are releasing ColdFusion on Wheels version 1.1 today. The + best framework for ColdFusion and Railo has ... +coverImage: null +legacyId: '57' +--- + +After nearly a year of coding countless bug fixes and building some top-notch new features, we are releasing ColdFusion on Wheels version 1.1 today. The best framework for ColdFusion and Railo has gotten a significant upgrade in this stable release. This truly should be a point of pride for both the Wheels _and_ CFML communities. [Download version 1.1 now](https://cfwheels.org/download) and read the [instructions for upgrading from 1.0.x](https://cfwheels.org/docs/1-1/chapter/upgrading-wheels) if you're upgrading. These new features (and more) are here to help you write beautiful code and save time all at once: + +- [Nested properties](https://cfwheels.org/docs/1-1/chapter/nested-properties) allow you to save changes to multiple associated database tables in one form object. +- All database calls are wrapped in [transactions](https://cfwheels.org/docs/1-1/chapter/transactions) by default. +- [Automatic validations](https://cfwheels.org/docs/1-1/chapter/object-validation) give Wheels the ability to introspect your database and register validations without your needing to write a single line of code. +- Support for the [H2 database engine](https://cfwheels.org/docs/1-1/chapter/requirements). +- You can now [respond to requests for HTML, JSON, XML, PDF, Excel, and more](https://cfwheels.org/docs/1-1/chapter/responding-with-multiple-formats) in a single controller action. +- [Automatic dependency handling](https://cfwheels.org/docs/1-1/chapter/associations) for your models’ associated data is now available. +- [Nested layouts](https://cfwheels.org/docs/1-1/chapter/using-layouts) allow you to extend layouts and remove repetition in your view code. +- Even more is outlined in the [CHANGELOG](http://code.google.com/p/cfwheels/source/browse/branches/1.1/wheels/CHANGELOG). + +## A Year's Worth of Growth + +It's interesting to think back on the previous year and reflect on how much we've grown in 12 short months. Everything worth mentioning revolves around **community**. + +- Our [Google Group](http://groups.google.com/group/cfwheels) is one of the most active in open source CF, and it's exciting to see so many new faces join each month. +- The [core team](https://cfwheels.org/community/core-team) has really hit its stride. It's very hard to keep up with all of the [activity in our Google Code repo](http://code.google.com/p/cfwheels/updates/list). This project is a team effort, not a one-man show. +- Members of our community had some [exposure at CFML conferences, user groups, and meetups](https://cfwheels.org/events) all throughout 2010. + +Thank you so much everyone for your support and hard work. The community is what makes this project the joy that it is. + +## Onward to 1.2 + +While it is awesome to look back on 2010 and the release of the 1.1 cycle, we're now ready to move on to some bigger and better things. We look forward to working with everyone to make modern ColdFusion development even more fun and approachable with Wheels over the coming months. diff --git a/web/content/blog/posts/way-new-collaboration.md b/web/content/blog/posts/way-new-collaboration.md new file mode 100644 index 0000000000..1f35398376 --- /dev/null +++ b/web/content/blog/posts/way-new-collaboration.md @@ -0,0 +1,18 @@ +--- +title: Way-New Collaboration +slug: way-new-collaboration +publishedAt: '2008-12-25T21:50:18.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Update: I wrote this blog post because I was fired up. Of course, I realize + that you're looking at the blog about Rails for ColdFusion. I was merely + trying to get you to see the significance of wha... +coverImage: null +legacyId: '17' +--- + +_Update: I wrote this blog post because I was fired up. Of course, I realize that you're looking at the blog about Rails for ColdFusion. I was merely trying to get you to see the significance of what we're doing here. Apologies if anyone thought that I was slamming the project. It really is a great thing!_ I've been addicted to TED Talks for the past couple years. Recently, I caught up with a talk by author Howard Rheingold, called [Way-new collaboration](http://www.ted.com/index.php/talks/view/id/216). (For those of you in RSS Land, click through to see the video.) We're at an interesting time for the ColdFusion community. Unless we start opening up and collaborating more, we're going to get swallowed up by the competition. I know that we're all used to hearing that the sky is falling in CF land. But this is something that we need to do. Where's our WordPress? Where's our Rails? It's all up to you to get this moving. Volunteering is about more than writing code. How can you contribute? diff --git a/web/content/blog/posts/weekend-reading-new-documentation.md b/web/content/blog/posts/weekend-reading-new-documentation.md new file mode 100644 index 0000000000..954dc7e120 --- /dev/null +++ b/web/content/blog/posts/weekend-reading-new-documentation.md @@ -0,0 +1,35 @@ +--- +title: 'Weekend Reading: New Documentation' +slug: weekend-reading-new-documentation +publishedAt: '2008-12-22T21:34:25.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Along with the 0.8 release of + Wheels(http://www.cfwheels.com/blog/index.cfm/2008/8/18/Released-ColdFuson-on-Wheels-Version-08) + came a whole slew of new chapters in our Documentation(http://www.cfwh... +coverImage: null +legacyId: '13' +--- + +Along with the [0.8 release of Wheels](http://www.cfwheels.com/blog/index.cfm/2008/8/18/Released-ColdFuson-on-Wheels-Version-08) came a whole slew of new chapters in our [Documentation](http://www.cfwheels.com/docs). If you were looking into learning a little bit more about the framework over the weekend, the [Docs](http://www.cfwheels.com/docs) are a great place to start. For those of you who have been following along since before 0.8, here's what's new: + +- [Frameworks and Wheels](http://www.cfwheels.com/docs/chapter/frameworks-and-wheels) +- [Obfuscating URLs](http://www.cfwheels.com/docs/chapter/obfuscating-urls) +- [Event Handlers](http://www.cfwheels.com/docs/chapter/event-handlers) +- [Column Statistics](http://www.cfwheels.com/docs/chapter/column-statistics) +- [Dynamic Finders](http://www.cfwheels.com/docs/chapter/dynamic-finders) +- [Getting Paginated Data](http://www.cfwheels.com/docs/chapter/getting-paginated-data) +- [Displaying Links for Pagination](http://www.cfwheels.com/docs/chapter/displaying-links-for-pagination) +- [Switching Environments](http://www.cfwheels.com/docs/chapter/switching-environments) + +All other chapters are updated for 0.8 as well. As for the future of documentation, here are some of my hopes and dreams: + +- Documentation at the function level for the Wheels API (which is done for the most part... I just need to get it formatted and on the site!) +- A better navigation system for the Docs themselves +- A "Livedocs" format akin to [how Adobe does it](http://livedocs.adobe.com/coldfusion/8/htmldocs/index.html) + +Please [let us know](http://groups.google.com/group/cfwheels) if we're not clear about something in the Docs or if you have any ideas! diff --git a/web/content/blog/posts/welcome-don-humphreys-core-team.md b/web/content/blog/posts/welcome-don-humphreys-core-team.md new file mode 100644 index 0000000000..53ac3ebaa0 --- /dev/null +++ b/web/content/blog/posts/welcome-don-humphreys-core-team.md @@ -0,0 +1,19 @@ +--- +title: Welcome Don Humphreys to the core team +slug: welcome-don-humphreys-core-team +publishedAt: '2011-08-25T17:30:31.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Please join me in welcoming Don + Humphreys(https://cfwheels.org/user/profile/280) to the Wheels core + team(https://cfwheels.org/community/core-team). Don has certainly grabbed our + attention over the ... +coverImage: null +legacyId: '71' +--- + +Please join me in welcoming [Don Humphreys](https://cfwheels.org/user/profile/280) to the [Wheels core team](https://cfwheels.org/community/core-team). Don has certainly grabbed our attention over the past few months with development of the [CFRel](https://cfwheels.org/plugins/listing/68) and [ColdRoute](https://cfwheels.org/plugins/listing/67) plugins, which bring some significant Rails 3 features to Wheels. Congratulations Don! We're looking forward to your contributions to the project. You can follow Don on GitHub as [dhumphreys](https://github.com/dhumphreys) and Twitter as [@dhumphreys88](http://twitter.com/dhumphreys88). diff --git a/web/content/blog/posts/welcome-james-gibson-core-team.md b/web/content/blog/posts/welcome-james-gibson-core-team.md new file mode 100644 index 0000000000..af28792723 --- /dev/null +++ b/web/content/blog/posts/welcome-james-gibson-core-team.md @@ -0,0 +1,19 @@ +--- +title: Welcome James Gibson to the Core Team +slug: welcome-james-gibson-core-team +publishedAt: '2009-12-25T10:39:29.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + We're happy to announce the addition of James + Gibson(http://iamjamesgibson.com/) to the Wheels core team. The core team + leads the development and community efforts of the framework. James has been + ... +coverImage: null +legacyId: '29' +--- + +We're happy to announce the addition of [James Gibson](http://iamjamesgibson.com/) to the Wheels core team. The core team leads the development and community efforts of the framework. James has been actively submitting patches to the Google Code site for a while now. He finds a problem and immediately gets to work on fixing it himself. That's a guy that we need on the team! Please join me in congratulating James. We all look forward to our project getting that much better with him on board. diff --git a/web/content/blog/posts/wheels-3-0-project-structure-what-changed-and-why-it-matters.md b/web/content/blog/posts/wheels-3-0-project-structure-what-changed-and-why-it-matters.md new file mode 100644 index 0000000000..95bc4240ed --- /dev/null +++ b/web/content/blog/posts/wheels-3-0-project-structure-what-changed-and-why-it-matters.md @@ -0,0 +1,24 @@ +--- +title: 'Wheels 3.0 Project Structure: What Changed and Why It Matters' +slug: wheels-3-0-project-structure-what-changed-and-why-it-matters +publishedAt: '2026-01-15T10:49:58.000Z' +updatedAt: '2026-01-15T15:49:58.000Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - project-structure + - framework-architecture + - application-layout + - developer-experience +categories: + - Documentation + - Releases +excerpt: >- + One of the first noticeable differences when you start building applications + with Wheels 3.0 is the way your project is laid out. This change may seem + small at first glance, but it has a significan... +coverImage: null +legacyId: '135' +--- + +One of the first noticeable differences when you start building applications with Wheels 3.0 is the way your project is laid out. This change may seem small at first glance, but it has a significant impact on clarity, security, and maintainability compared to Wheels 2.5. In this article, we’ll explore: \* What changed \* Why it matters \* How it affects your development workflow \* Practical steps when starting a new project Let’s dive in. # \*\*What Changed in Wheels 3.0\*\* In Wheels 3.0, the framework core is separated from your application code in a clear and intentional way: \* Core framework files now live under vendor/wheels instead of being mixed into the application root. \* Only the essential application folders remain at the root. \* Static assets, configuration, and app code each live in well-defined places. This change makes your project easier to understand and harder to accidentally modify your framework internals. Here's what the major change means in practice: # \*\*Before (Wheels 2.5):\*\* \* Framework files were inside the project root \* Application and framework files lived beside each other \* Harder to distinguish app code from framework code # \*\*Now (Wheels 3.0):\*\* \* Core Wheels files are under: \*\*vendor/wheels\*\* \* App code lives under: \*\*app/controllers\*\*, \*\*app/models\*\*, \*\*app/views\*\* \* Public assets live in: \*\*public/\*\* \* Configuration stays clean in: \*\*config/\*\* \* Tests and support files also have their own folders This creates a clear \*\*separation of concerns\*\* between your code and the framework itself. # \*\*Why This Matters\*\* \*\*1. Cleaner Application Root\*\* Your project’s root folder now contains only what you are responsible for — configs, public assets, and your business logic. This reduces clutter and makes onboarding easier for new developers. \*\*2. Better Security and Maintainability\*\* Separating framework files into vendor/wheels means your core framework files aren’t directly modified during development. Updates and upgrades become safer and more predictable. \*\*3. Improved Tooling Compatibility\*\* Tools like dependency managers, linters, and CI/CD pipelines expect clear boundaries in a project structure. With the new layout, automation becomes easier to implement and maintain. \*\*4. Standardized App Layout\*\* Wheels 3.0 aligns more with conventions seen in other modern frameworks — where core dependencies are isolated and app code lives in a predictable structure. If you’ve ever used frameworks like Ruby on Rails, Laravel, or Django, this feels instantly familiar — and that’s by design. \*\*Working With the New Structure\*\* When you generate a new Wheels 3.0 project using the CLI, this structure is set up automatically: \`\`\` wheels g app myapp cd myapp server start \`\`\` Once created, you’ll see: \`\`\` /app   /controllers   /models   /views /config /public /tests /vendor   /wheels \`\`\` \*\*Key folders explained:\*\* \*\*app/:\*\* Your controllers, models, and views \*\*config/:\*\* Application configuration \*\*public/:\*\* Static assets and entry point (index.cfm) \*\*vendor/wheels/:\*\* The Wheels framework code \*\*tests/:\*\* Test suite (TestBox etc.) This structure empowers you to maintain clean code boundaries while keeping your application logical and organized. \*\*When You Should Care\*\* You’ll immediately see benefits from this structure: \* When starting a new project \* When upgrading from Wheels 2.5 \* When setting up version control \* During code reviews \* When training new developers It reduces accidental edits to core files and sets a clear path for scaling your project. \*\*In Summary\*\* Wheels 3.0’s revised project structure — where the core framework lives under vendor/wheels and your application is cleanly separated — is one of the most foundational changes you’ll notice as a developer. This change delivers: \* Cleaner project roots \* Better separation of concerns \* Easier upgrades \* And a structure that scales with your application If you want a framework that feels organized from day one, this update sets the tone for all your future work in Wheels 3.0. diff --git a/web/content/blog/posts/wheels-3-0-request-handling-the-move-to-public-index-cfm.md b/web/content/blog/posts/wheels-3-0-request-handling-the-move-to-public-index-cfm.md new file mode 100644 index 0000000000..8247f5727f --- /dev/null +++ b/web/content/blog/posts/wheels-3-0-request-handling-the-move-to-public-index-cfm.md @@ -0,0 +1,38 @@ +--- +title: 'Wheels 3.0 Request Handling: The Move to public/index.cfm' +slug: wheels-3-0-request-handling-the-move-to-public-index-cfm +publishedAt: '2026-01-20T12:50:39.000Z' +updatedAt: '2026-01-20T17:50:39.000Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - request-handling + - front-controller + - public-index-cfm + - application-architecture +categories: [] +excerpt: >- + One of the most fundamental changes in Wheels 3.0 is how incoming HTTP + requests enter your application. While this change is easy to overlook, it + directly impacts routing, security, deployment, and... +coverImage: null +legacyId: '136' +--- + +One of the most fundamental changes in Wheels 3.0 is how incoming HTTP requests enter your application. While this change is easy to overlook, it directly impacts routing, security, deployment, and mental model clarity. +In Wheels 3.0, all web requests now flow through a single entry point: \*\*public/index.cfm\*\* +This article explains: \* How request handling worked in Wheels 2.5 \* What changed in Wheels 3.0 \* Why this change was necessary \* How it improves security and predictability \* What this means for your applications going forward # \*\*How Request Entry Worked in Wheels 2.5\*\* In Wheels 2.5, request handling relied on multiple files at the application root, most notably: \* root.cfm \* rewrite.cfm \* .htaccess (or web server rewrites) Depending on your server configuration and rewrite rules, requests could pass through different files before reaching the framework. While this worked, it introduced several issues: \* Multiple “entry points” into the application \* Harder-to-reason-about execution flow \* Increased risk of exposing internal files \* Confusion for new developers \* Differences in behavior across servers and environments In short, \*\*the request lifecycle was implicit\*\*, not obvious. + +\# \*\*What Changed in Wheels 3.0\*\* Wheels 3.0 introduces a single, \*\*explicit request entry point\*\*: \`/public/index.cfm\`. All HTTP requests are now routed through this file. Key changes: \* \`index.cfm\` lives inside the public directory \* Only the public directory is meant to be web-accessible \* Internal application files are no longer directly reachable \* Routing begins in one predictable place, every time This aligns Wheels with modern framework conventions and removes ambiguity from request handling. + +\# \*\*Why This Change Matters\*\* \*\*One Entry Point = Predictability\*\* With a single entry file: \* Every request starts the same way \* Debugging becomes easier \* Middleware, routing, and lifecycle hooks behave consistently There is no longer a need to mentally trace whether a request went through \`root.cfm\`, \`rewrite.cfm\`, or both. + +\# \*\*Improved Security by Default\*\* By serving only the \*\*public directory\*\*: \* Internal files (\`app/\`, \`config/\`, \`vendor/\`) are never exposed \* Accidental access to framework internals is eliminated \* Safer defaults for production environments This is a major improvement over Wheels 2.5, where misconfigured servers could expose sensitive files. + +\# \*\*Clear Separation Between Web and Application Code\*\* In Wheels 3.0: \* public/ contains only what the web server should serve \* Application logic lives elsewhere \* The framework controls the request lifecycle from the moment it enters the app This separation is intentional and foundational to the 3.0 architecture. + +\# \*\*Better Alignment with Modern Frameworks\*\* Frameworks like Rails, Laravel, Django, and Phoenix all use a single front controller pattern. Wheels 3.0 adopts this same approach, making the framework: \* Easier to understand for developers coming from other ecosystems \* Easier to deploy on modern hosting platforms \* Easier to reason about in CI/CD pipelines # \*\*What Happens Inside public/index.cfm\*\* The index.cfm file acts as the front controller. Its responsibilities include: \* Bootstrapping the application \* Loading configuration \* Initializing the framework \* Dispatching the request to the appropriate controller/action \* Ensuring consistent lifecycle execution While you generally won’t need to modify this file, its presence provides a \*\*clear and intentional starting point\*\* for every request. + +\# \*\*Deployment Implications\*\* To use Wheels 3.0 correctly, your web server should be configured so that the document root points to: \`/public\`. All requests are routed through \`index.cfm\`. This applies whether you’re using: \* CommandBox \* Apache \* Nginx \* IIS \* Docker-based deployments Once configured, Wheels handles routing internally — no additional rewrite files are required inside the application root. + +\# \*\*Migrating from Wheels 2.5\*\* When upgrading: \* Remove reliance on root.cfm and \`rewrite.cfm\` \* Update your web server’s document root to \`public/\` \* Verify that no application files outside \`public/\` are directly accessible Most applications will benefit immediately from: \* Cleaner URLs \* Safer defaults \* Fewer environment-specific edge cases # \*\*Summary\*\* The move to \`public/index.cfm\` in Wheels 3.0 may seem small, but it sets the foundation for: \* Predictable request handling \* Stronger security \* Cleaner application structure \* Easier debugging \* Modern deployment workflows This change reflects a broader theme in Wheels 3.0: making the framework \*\*explicit, intentional, and easier to reason about\*\* — starting from the very first line of code that runs. diff --git a/web/content/blog/posts/wheels-3-0-setting-up-your-development-environment.md b/web/content/blog/posts/wheels-3-0-setting-up-your-development-environment.md new file mode 100644 index 0000000000..37f6bdeea7 --- /dev/null +++ b/web/content/blog/posts/wheels-3-0-setting-up-your-development-environment.md @@ -0,0 +1,61 @@ +--- +title: 'Wheels 3.0: Setting Up Your Development Environment' +slug: wheels-3-0-setting-up-your-development-environment +publishedAt: '2025-03-15T22:42:56.000Z' +updatedAt: '2025-06-02T13:05:31.000Z' +author: Peter Amiri +tags: + - 2-5 + - 3-0 + - cfwheels + - cli + - wheels + - wheels-3-0 +categories: [] +excerpt: Accompanying Video +coverImage: null +legacyId: '130' +--- + +## Accompanying Video + +This blog post has an accompanying video posted to [YouTube](https://youtu.be/-76Z_N27siE). + +## Introduction + +The forthcoming release of the Wheels 3.0 framework is creating waves in the development community, promising transformative enhancements and simplified workflows. In this blog post, we will focus on establishing the foundational environment crucial for executing Wheels projects efficiently. We'll guide you through project creation using both the current and the upcoming 3.0 versions of the framework and will explore the differences in their directory structures. Let's dive right in! + +## Installing CommandBox + +The cornerstone of our setup is CommandBox, a versatile tool that modernizes the CFML developer's workflow. CommandBox serves as a command line shell, a package manager, and a seamless interface to start a CFML engine in any given directory, without the need to juggle complex application server installations. CommandBox is accessible for Mac, Windows, and Linux OS, with installation methods varying accordingly. For Mac users like me, Homebrew is the chosen method for installation, while Windows users can turn to Chocolaty or a native installer, and Linux enthusiasts can rely on built-in package managers. + +## CommandBox and Wheels CLI Setup + +Once CommandBox is installed, jump into the CommandBox shell via the \`BOX\` command in the terminal window. Note that the first launch involves downloading several packages which could take some time. Following the setup, install the Wheels CLI commands into CommandBox using \`INSTALL WHEELS-CLI\`. Although I've already completed this step earlier, executing this ensures you are equipped with the right tools to proceed. + +## Creating Projects with Wheels + +With CommandBox ready, embark on creating two projects using the \`WHEELS NEW\` command. This command initiates a wizard that will actively guide you through the process of setting up a new Wheels project. + +## 1\. Creating a Current Version Project + +1. **Naming the Project**: First, supply a name for the project, for instance, "CURRENT", which creates a directory embodying the project files. +2. **Template Selection**: Choose the template corresponding to the current version and proceed with the default options. +3. **Project Initialization**: Conclude the process with a "Yes" to affirm configuration and initiate project setup. The CLI will create the project directory and integrate necessary files. Launch the server with \`START\` and witness the "Congratulations" page, assuring correct installation. + +## 2\. Creating a Wheels 3.0 Version Project + +1. **Naming the Project**: Again, deploy \`WHEELS NEW\` to name your project. +2. **Template Selection**: This time, select the "Bleeding Edge" template for a Wheels 3.0 implementation. Confirm defaults and proceed to build your project. +3. **Project Initialization**: Use the \`START\` command to usher in a new CFML application server, culminating in a fresh "Congratulations" page highlighting the new branding and 3.0 framework base. + +## Exploring Directory Structures + +A crucial step is to delve into the structural differences between the two projects: + +1. **Current Version**: This project exhibits a larger assortment of directories and files at its root, which poses an increased potential attack surface. +2. **Wheels 3.0**: The new framework refines this exposure significantly, only housing four directories at the root. Key directories like config, controllers, and views reside under the \`app\` directory, while static resources like images and stylesheets find home under the \`public\` directory. The \`vendor\` directory now accommodates core framework files, enhancing security by mapping only the public folder to the webroot of the application server. + +## Conclusion + +Setting up an environment for Wheels 3.0 marks the beginning of an exciting journey in CFML development. From installing CommandBox to exploring framework nuances, we have geared up for advanced Wheels projects. diff --git a/web/content/blog/posts/wheels-added-cfml-framework-generator-eclipse.md b/web/content/blog/posts/wheels-added-cfml-framework-generator-eclipse.md new file mode 100644 index 0000000000..9349e1635a --- /dev/null +++ b/web/content/blog/posts/wheels-added-cfml-framework-generator-eclipse.md @@ -0,0 +1,18 @@ +--- +title: Wheels Added to CFML Framework Generator for Eclipse +slug: wheels-added-cfml-framework-generator-eclipse +publishedAt: '2009-12-17T09:01:12.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + Robert Burns was pretty quick at adding Wheels to his CFML Framework Skeletons + plugin(http://www.robertburns.me/blog/archives/145) for Eclipse after we + released version 1.0. After installing the pl... +coverImage: null +legacyId: '25' +--- + +Robert Burns was pretty quick at adding Wheels to his [CFML Framework Skeletons plugin](http://www.robertburns.me/blog/archives/145) for Eclipse after we released version 1.0. After installing the plugin in CFEclipse or ColdFusion Builder, you can start a new Wheels project in a wizard that appears after going to File > New > Project.... It will load up all the framework files that you need automatically. ![ColdFusion on Wheels is now an option in the framework generator plugin for Eclipse.](https://cfwheels.org/images/blog/2009/12/17/cfml-framework-generator.jpg) To install, add [http://www.robertburns.me/update/](http://www.robertburns.me/update/) to your update sites in Eclipse. The framework generator also supports code for ColdBox, FuseBox, FW/1, LightFront, Mach-II, and Model-Glue. diff --git a/web/content/blog/posts/wheels-api-documentation-available.md b/web/content/blog/posts/wheels-api-documentation-available.md new file mode 100644 index 0000000000..1409558c3b --- /dev/null +++ b/web/content/blog/posts/wheels-api-documentation-available.md @@ -0,0 +1,24 @@ +--- +title: Wheels API Documentation Available +slug: wheels-api-documentation-available +publishedAt: '2009-12-13T10:03:08.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Chris Peters +tags: [] +categories: + - Community +excerpt: >- + The documentation(https://cfwheels.org/) now contains a section that documents + all public functions in the Wheels API. You can now browse an complete list of + the functions(https://cfwheels.org/docs... +coverImage: null +legacyId: '27' +--- + +The [documentation](https://cfwheels.org/) now contains a section that documents all public functions in the Wheels API. You can now browse an [complete list of the functions](https://cfwheels.org/docs/function) or [browse by category](https://cfwheels.org/docs). It feels good to remove the apology for incomplete documentation from the documentation section! As with almost everything else on the site, there is a lot more that we want to do with this new API documentation. Let us know in the Google Group if you have any ideas. Some future plans are as follows: + +- Comments section +- Associate functions with other related functions and related chapters in the reference guide +- Search + +If you're interested in how we implemented this, visit [my blog post](http://www.clearcrystalmedia.com/pm/extra-cfc-attributes-documentation/ 'Using extra CFC attributes for documentation') where I briefly describe the general idea. diff --git a/web/content/blog/posts/wheels-blog-badges-wallpaper-t-shirts.md b/web/content/blog/posts/wheels-blog-badges-wallpaper-t-shirts.md new file mode 100644 index 0000000000..371614538b --- /dev/null +++ b/web/content/blog/posts/wheels-blog-badges-wallpaper-t-shirts.md @@ -0,0 +1,36 @@ +--- +title: 'Wheels Blog Badges, Wallpaper, and Free T-Shirts' +slug: wheels-blog-badges-wallpaper-t-shirts +publishedAt: '2010-12-30T23:06:05.000Z' +updatedAt: '2025-05-19T22:32:02.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + ColdFusion on Wheels will be giving away a limited number of How's My Coding? + t-shirts at cf.Objective(http://www.cfobjective.com/). In the spirit of + upcoming conferences and love for Wheels, Chaz ... +coverImage: null +legacyId: '61' +--- + +ColdFusion on Wheels will be giving away a limited number of **How's My Coding?** t-shirts at [cf.Objective](http://www.cfobjective.com/). In the spirit of upcoming conferences and love for Wheels, [Chaz Chumley](https://cfwheels.org/user/profile/123) has made **How's My Coding?** wallpaper and blog images. cf.Objective(), April 22-24, and [CFUnited](http://cfunited.com/), July 28-31, will have Wheels sessions so register, attend our sessions, and say Hi. + +### Blog Badges + +We have [several variations to choose from](http://github.com/chaz-chumley/cfwheels-extras). Here are two: ![](http://github.com/mhenke/cfwheels-extras/raw/master/badges/wheels_visit_small_logo-badge.jpg)![](http://github.com/mhenke/cfwheels-extras/raw/master/badges/wheels_call_big_logo-badge.jpg) Example code to place on your site + + + + + +### Wallpaper + +You can see and download the different wallpaper and badges psd/jpg files [here](http://github.com/chaz-chumley/cfwheels-extras). Since the images are hosted on [github](http://www.github.com/) feel free to send Chaz any pull requests of your contributions like altering a badge or creating a different sized wallpaper. + +### T-Shirt Giveaway + +Find [Mike Henke](https://cfwheels.org/user/profile/25) at cf.Objective() and show him the wallpaper on your computer or the blog badge on your site and he'll give you a free t-shirt while supplies last. + +Make [custom t-shirts](http://www.customink.com/) at CustomInk.com diff --git a/web/content/blog/posts/wheels-cli-asset-commands-precompile-clean-clobber.md b/web/content/blog/posts/wheels-cli-asset-commands-precompile-clean-clobber.md new file mode 100644 index 0000000000..c6ba83df4c --- /dev/null +++ b/web/content/blog/posts/wheels-cli-asset-commands-precompile-clean-clobber.md @@ -0,0 +1,21 @@ +--- +title: 'Wheels CLI Asset Commands: precompile, clean & clobber' +slug: wheels-cli-asset-commands-precompile-clean-clobber +publishedAt: '2026-03-19T16:31:01.254Z' +updatedAt: '2026-03-19T16:31:01.282Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - wheels-cli + - cli-commands +categories: + - CLI +excerpt: >- + \ Introduction So far in this series, we’ve explored how the Wheels CLI in 3.x + helps you manage your application’s environments, databases, plugins, and + testing workflows. Now we’re discussing anot... +coverImage: null +legacyId: '1159470321786880005' +--- + +\# Introduction So far in this series, we’ve explored how the Wheels CLI in 3.x helps you manage your application’s environments, databases, plugins, and testing workflows. Now we’re discussing another critical aspect of modern web applications: # Asset management. Every production-ready application depends on optimized frontend assets — CSS, JavaScript, images, fonts, and other static resources. During development, assets are often served individually for easier debugging. But in production, they must be optimized for performance. That’s where Wheels CLI asset commands come in. Instead of manually bundling, clearing, or rebuilding static files, Wheels 3.x provides structured commands to manage the asset pipeline directly from your terminal. The CLI now supports: \`\`\` wheels assets precompile wheels assets clean wheels assets clobber \`\`\` These commands transform asset handling from a manual deployment step into a repeatable, production-ready workflow. # Why Asset Commands Matter In real-world applications, asset management affects: \* Page load speed \* Caching efficiency \* SEO performance \* Production stability \* Deployment reliability Without proper asset control, you may encounter: \* Old CSS or JS being cached \* Missing compiled files \* Conflicts between development and production builds \* Bloated static assets \* Inconsistent deployments The Wheels CLI asset commands solve these issues with clarity and structure. # wheels assets precompile \`wheels assets precompile\` This command prepares your assets for production. It typically: \* Compiles CSS and JavaScript \* Bundles files \* Minifies output \* Generates fingerprinted filenames \* Optimizes static resources When to Use It \* Before deploying to staging \* Before deploying to production \* During CI/CD pipelines \* After frontend updates Instead of relying on runtime compilation, precompiling ensures assets are ready before the application goes live. \*\*Benefits\*\* \* Faster production performance \* Reduced runtime overhead \* Improved caching behavior \* Stable, predictable deployments Precompilation shifts processing from runtime to build time — which is a best practice in modern web architecture. # wheels assets clean \`wheels assets clean\` Over time, your compiled assets directory may accumulate outdated files. The \*\*clean\*\* command removes old or unused compiled assets while preserving necessary ones. \*\*Why This Is Important\*\* Without cleaning: \* Disk usage grows \* Old fingerprinted files remain \* Confusion increases during debugging \* Deployment directories become cluttered \*\*When to Use It\*\* \* After multiple deployments \* When troubleshooting asset conflicts \* Before running a fresh precompile \* During maintenance It keeps your asset directory organized and efficient. # wheels assets clobber \`wheels assets clobber\` The \*\*clobber\*\* command is more aggressive. It removes all compiled assets completely. Think of it as a full reset. \*\*When to Use It\*\* When assets are corrupted After major frontend restructuring When switching build strategies During deep troubleshooting After running: \`\`\` wheels assets clobber wheels assets precompile \`\`\` You get a completely fresh build from scratch. \*\*Why It’s Powerful\*\* \* Eliminates stale artifacts \* Removes hidden conflicts \* Forces a clean rebuild \* Ensures consistency Use it carefully — but confidently. # Example Production Workflow \*\*Before Deployment\*\* \`\`\` wheels assets clean wheels assets precompile \`\`\` \*\*If Something Feels Off\*\* \`\`\` wheels assets clobber wheels assets precompile \`\`\` \*\*CI/CD Example\*\* \`wheels assets precompile || exit 1\` Automated builds become reliable and predictable. # How These Commands Improve Team Workflows They bring: \* Standardized build processes \* Cleaner deployment cycles \* Faster load times \* Reduced caching bugs \* Better frontend stability \* Easier troubleshooting Instead of manually managing static files, everything is controlled via CLI — just like databases, environments, and plugins. # The Bigger Picture Earlier development workflows often mixed runtime asset handling with manual production steps. Wheels 3.x introduces structured asset lifecycle management. Just like: \* Database commands manage data \* Environment commands manage configuration \* Testing commands ensure quality \* Plugin commands extend functionality Asset commands manage performance and deployment consistency. This completes the development lifecycle. # What This Means for Wheels Developers With precompile, clean, and clobber, you gain: \* Faster production performance \* Reliable build processes \* Cleaner deployments \* Reduced frontend-related bugs \* Better CI/CD automation Assets are no longer an afterthought. They are part of your deployment discipline. # Conclusion The Wheels CLI asset commands in 3.x bring structure to frontend asset management: \* \`assets precompile\` → Prepare for production \* \`assets clean\` → Remove outdated builds \* \`assets clobber\` → Reset everything completely If environment commands help you deploy safely… If testing commands help you ensure quality… If plugin commands help you extend your app… Asset commands help you deliver performance. And in modern web development, performance is not optional — it’s expected. Stay tuned for more deep dives into the evolving Wheels CLI ecosystem. diff --git a/web/content/blog/posts/wheels-cli-config-commands-check-diff-dump.md b/web/content/blog/posts/wheels-cli-config-commands-check-diff-dump.md new file mode 100644 index 0000000000..1382a4d690 --- /dev/null +++ b/web/content/blog/posts/wheels-cli-config-commands-check-diff-dump.md @@ -0,0 +1,20 @@ +--- +title: 'Wheels CLI Config Commands: check, diff & dump' +slug: wheels-cli-config-commands-check-diff-dump +publishedAt: '2026-02-26T19:07:54.145Z' +updatedAt: '2026-03-04T17:25:40.711Z' +author: Zain Ul Abideen +tags: + - wheels-cli + - wheels-3-0 +categories: + - CLI +excerpt: >- + \ Introduction In our previous article, Wheels CLI Essentials: Inspect Your + App with about & get Commands, we explored how Wheels 3.x helps you understand + your application's runtime state. Those co... +coverImage: null +legacyId: '1153543943534673921' +--- + +\# Introduction In our previous article, Wheels CLI Essentials: Inspect Your App with about & get Commands, we explored how Wheels 3.x helps you understand your application's runtime state. Those commands focused on visibility. Now we go one layer deeper. This article introduces three powerful configuration-focused commands: \* wheels config check \* wheels config diff \* wheels config dump These commands are not about what is running. They’re about how your configuration is structured, validated, and compared. If \*\*about\*\* and \*\*get\*\* gave you awareness, these commands give you control. # Why Configuration Commands Matter In modern applications, configuration complexity grows quickly: \* Multiple environments \* Default framework settings \* Custom overrides \* Team-specific environment variables \* CI/CD configuration differences \* Production hotfixes Over time, small configuration mismatches can cause major issues: \* “It works on my machine.” \* Staging behaves differently from production. \* A default value overrides a custom setting. \* A config file was edited but not deployed. The new config commands are built to prevent exactly these problems. They give you validation, comparison, and export tools — directly from the CLI. # wheels config check \*\*Validate Your Configuration with Confidence\*\* \`wheels config check\` The \*\*check\*\* command validates your configuration setup and ensures: \* Required settings exist \* No invalid configuration keys are present \* Environment files are structured correctly \* Overrides are applied properly \* No conflicting definitions exist Think of it as a configuration health check. \*\*When to Use config check\*\* Before Deployment: Run it before pushing to staging or production: \`wheels config check\` This ensures: \* No missing environment settings \* No accidental debug flags \* No incomplete overrides It acts like a pre-flight checklist. After Updating Configuration: Changed a config file? Added a new environment variable? Run: \`wheels config check\` It confirms everything is wired correctly. Why config check Is Powerful: \* Prevents runtime configuration errors \* Catches typos in setting names \* Validates environment consistency \* Encourages safe deployment practices Instead of discovering configuration errors in production… You catch them instantly. # wheels config diff \*\*Compare Configuration Across Environments\*\* \`wheels config diff development production\` The diff command compares configuration values between environments. It shows: \* What differs \* What exists in one environment but not another \* What values are overridden This is extremely valuable in multi-environment workflows. \*\*Why config diff Matters\*\* Environment mismatches are one of the most common causes of bugs. Examples: \* Caching enabled in production but not staging \* Different datasource names \* Different mail server settings \* Logging levels not aligned Instead of manually comparing config files, run: \`wheels config diff staging production\` You instantly see differences in a clean, structured output. \*\*Real-World Scenario\*\* You deploy to production. Something behaves differently from staging. Instead of guessing: \`wheels config diff staging production\` Now you know: \* Exactly what changed \* Whether a setting was missed \* Whether a production override is affecting behavior This command alone can save hours of manual inspection. \*\*Why config diff Is Essential\*\* \* Eliminates manual file comparisons \* Prevents environment drift \* Improves team collaboration \* Simplifies debugging In larger teams, configuration drift is inevitable. This command keeps environments aligned. # wheels config dump Export Your Full Configuration Snapshot \`wheels config dump\` The \*\*dump\*\* command outputs your complete resolved configuration. It includes: \* Default framework settings \* Application-level overrides \* Environment-specific settings \* Fully merged configuration values Think of it as a raw configuration export. \*\*When to Use config dump\*\* Auditing: Need to see everything at once? \`wheels config dump\` You get a complete configuration snapshot. \*\*Debugging Complex Overrides\*\* Sometimes a setting comes from: \* Framework defaults \* settings.cfm \* Environment-specific files \* System environment variables Instead of tracing multiple layers manually, dump shows the final resolved result. \*\*Sharing Configuration Safely\*\* When collaborating with teammates, you can: \* Dump configuration \* Review it together \* Identify unexpected overrides It creates transparency. \*\*Why config dump Is Valuable\*\* Full visibility into final configuration state \* Simplifies advanced debugging \* Helps audit production setups \* Encourages configuration discipline It removes ambiguity. # How These Commands Work Together Here’s a practical workflow: \*\*Step 1 – Validate\*\* \`wheels config check\` Ensure configuration structure is correct. \*\*Step 2 – Compare\*\* \`wheels config diff staging production\` Identify environment differences. \*\*Step 3 – Export Snapshot\*\* \`wheels config dump\` Review the full resolved configuration. Together, they form a powerful configuration management toolkit. # The Bigger Shift in CLI Philosophy Earlier versions of CLI tools focused primarily on: \* Generating controllers \* Creating models \* Scaffolding applications Wheels 3.x is expanding beyond scaffolding. It’s becoming: \* A configuration validator \* An environment consistency enforcer \* A debugging assistant \* A deployment safety layer This shift reflects modern development needs. Applications today are not just code. They are configuration-driven systems. And configuration must be inspectable, verifiable, and comparable. # What This Means for Wheels Developers With config check, config diff, and config dump, you gain: \* Safer deployments \* Fewer environmental surprises \* Faster debugging cycles \* Better team collaboration \* Stronger production confidence These are not flashy commands. They don’t generate files. They don’t create scaffolds. But they solve real-world development problems — the kind that cost time, trust, and production stability. # Conclusion The new configuration commands in Wheels CLI 3.x are small additions — but major upgrades to your workflow. \* \*\*wheels config check\*\* protects you from configuration mistakes \* \*\*wheels config diff\*\* prevents environment drift \* \*\*wheels config dump\*\* gives you full transparency If previous CLI commands helped you build faster… These help you deploy more safely. And in modern software development, safe deployments are everything. Stay tuned — the next deep dive into Wheels CLI is coming. Learn more here: https://youtu.be/6RJWe3RQp1Q diff --git a/web/content/blog/posts/wheels-cli-database-commands-db-create-db-drop.md b/web/content/blog/posts/wheels-cli-database-commands-db-create-db-drop.md new file mode 100644 index 0000000000..086c1c544d --- /dev/null +++ b/web/content/blog/posts/wheels-cli-database-commands-db-create-db-drop.md @@ -0,0 +1,21 @@ +--- +title: 'Wheels CLI Database Commands: db create & db drop' +slug: wheels-cli-database-commands-db-create-db-drop +publishedAt: '2026-03-05T18:13:57.669Z' +updatedAt: '2026-03-05T18:39:37.991Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - wheels-cli + - cli-commands +categories: + - CLI +excerpt: >- + \ Introduction So far in this series, we’ve explored how the Wheels CLI in 3.x + helps you inspect your application, manage configuration, and control + environments safely. Now we’re moving into somet... +coverImage: null +legacyId: '1155515146896900099' +--- + +\# Introduction So far in this series, we’ve explored how the Wheels CLI in 3.x helps you inspect your application, manage configuration, and control environments safely. Now we’re moving into something even more foundational: \*\*database lifecycle management\*\*. Your application might have clean code and perfectly aligned environments — but without a properly provisioned database, nothing works. In a Wheels application, the database is not just storage. It powers: \* Migrations \* Application data \* Session handling \* Background jobs \* Automated tests \* API responses It’s core infrastructure. And whether you're: \* Setting up a new project \* Onboarding a teammate \* Preparing a staging server \* Resetting a development database \* Cleaning up after automated CI tests You’ll eventually need to create or drop a database. Traditionally, this meant: \* Logging into the database server manually \* Running raw SQL commands \* Managing permissions \* Double-checking you weren’t targeting production \* Repeating the same setup steps across environments It was manual. It was inconsistent. And sometimes — risky. Wheels CLI simplifies this by using your existing environment and datasource configuration to manage database provisioning directly from your project root safely. That’s where these two powerful commands come in: \`\`\` wheels db create wheels db drop \`\`\` Simple in appearance. Powerful in impact. # Why Database CLI Commands Matter Traditionally, creating or dropping databases meant: \* Logging into SQL Server / MySQL / PostgreSQL manually \* Running SQL scripts \* Managing permissions \* Copying credentials \* Risking mistakes In team environments, this creates friction: \* “What’s the correct database name?” \* “Which server do I connect to?” \* “Is this staging or production?” \* “Did I just drop the wrong database?” The Wheels CLI eliminates this confusion by using your existing environment configuration. It knows: \* Your datasource \* Your database name \* Your environment \* Your credentials And it acts accordingly. # wheels db create Create a Database Instantly \`wheels db create\` This command creates the configured database for your active environment. It reads: \* Environment settings \* Datasource configuration \* Database name \* Connection credentials Then it provisions the database automatically. \*\*When to Use db create\*\* New Project Setup: \`\`\` wheels environment show wheels db create \`\`\` Your local database is ready — no manual SQL required. Onboarding a Team Member: Instead of sending setup documentation with SQL instructions: \*“Just run wheels db create.”\* It standardizes project setup. Automated Test Environments: In CI pipelines: \`wheels db create\` The database is created dynamically for testing. After tests complete, it can be dropped cleanly. \*\*What Happens Behind the Scenes:\*\* The command: 1. Connects to your DB server 2. Checks whether the database exists 3. Creates it if missing 4. Validates permissions 5. Confirms success It respects your current environment. That means: If you are in development → It creates the development DB. If you are in staging → It creates the staging DB. No cross-environment confusion. # wheels db drop Drops the configured database. This command permanently deletes a database. This is a destructive operation that cannot be undone. \`wheels db drop\` This command drops the database for the active environment. Used carefully, it’s extremely powerful. Used recklessly, it’s dangerous. That’s why environment awareness is critical. \*\*When to Use db drop\*\* Resetting Development: Need a clean slate? \`\`\` wheels db drop wheels db create \`\`\` Now you have a fresh database. Perfect for schema resets or major refactors. Rebuilding After Migration Changes: If migrations changed significantly: \`\`\` wheels db drop wheels db create wheels db migrate latest \`\`\` You’re back to a fully rebuilt database. CI/CD Cleanup: In automated pipelines: \`wheels db drop\` Removes temporary test databases after completion. \*\*Safety First: Environment Awareness\*\* Before running db drop, always confirm your environment: \`wheels environment show\` Dropping a production database accidentally is catastrophic. That’s why best practice is: 1. Confirm environment 2. Validate settings 3. Then execute database commands # Example Safe Workflow Step 1 – Confirm Environment \`wheels environment show\` Step 2 – Validate Environment \`wheels environment validate\` Step 3 – Drop (if safe) \`wheels db drop\` Step 4 – Recreate \`wheels db create\` This structured process prevents irreversible mistakes. # Real-World Development Scenarios \*\*Scenario 1: Local Development Reset\*\* You’ve been experimenting with schema changes. Your database is messy. Instead of manually cleaning tables: \`\`\` wheels db drop wheels db create \`\`\` Clean slate. Fresh start. Zero manual SQL. \*\*Scenario 2: Staging Server Preparation\*\* Before pushing new features: \`\`\` wheels environment switch staging wheels db create \`\`\` Ensures staging DB exists and matches configuration. \*\*Scenario 3: Automated Testing\*\* Your CI workflow: \`\`\` wheels environment set testing wheels db create wheels test run wheels db drop \`\`\` Fully automated lifecycle. No manual intervention. # How These Commands Improve Team Workflows They: \* Standardize database setup \* Reduce onboarding friction \* Eliminate manual SQL steps \* Prevent configuration mismatches \* Support automated pipelines \* Encourage safe environment practices In modern development, repeatability matters. These commands make database setup repeatable. # The Bigger Philosophy Earlier CLI tools focused on scaffolding code. Wheels 3.x CLI is evolving into: \* An environment manager \* A configuration validator \* A deployment assistant \* A database lifecycle controller Applications aren’t just code. They are infrastructure + configuration + environments + data. Managing databases via CLI is a natural evolution. # Important Best Practices Before using database commands: \* Always confirm environment \* Never drop production unless intentional \* Use validation commands \* Automate in CI when possible \* Keep credentials secure Treat database commands with respect. They’re powerful by design. # Conclusion The new database commands in Wheels CLI 3.x simplify one of the most critical parts of application management. \`wheels db create\` → Instantly provision databases \`wheels db drop\` → Cleanly remove databases Together, they: \* Speed up development \* Simplify onboarding \* Enable automation \* Support safe workflows \* Reduce manual SQL tasks If scaffolding commands help you build faster… Environment commands help you deploy safer… These database commands help you reset, rebuild, and automate smarter. And in modern development, controlled data management is everything. Stay tuned — more Wheels CLI deep dives are coming. Learn more here: https://youtu.be/HYXg5CtxrYQ diff --git a/web/content/blog/posts/wheels-cli-environment-commands-set-show-merge-switch-validate.md b/web/content/blog/posts/wheels-cli-environment-commands-set-show-merge-switch-validate.md new file mode 100644 index 0000000000..566e82cb18 --- /dev/null +++ b/web/content/blog/posts/wheels-cli-environment-commands-set-show-merge-switch-validate.md @@ -0,0 +1,21 @@ +--- +title: 'Wheels CLI Environment Commands: set, show, merge, switch & validate' +slug: wheels-cli-environment-commands-set-show-merge-switch-validate +publishedAt: '2026-03-02T19:01:05.628Z' +updatedAt: '2026-03-02T19:01:05.654Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - wheels-cli + - cli-commands +categories: + - CLI +excerpt: >- + \ Introduction In our previous deep dives, we explored how the Wheels CLI + helps you inspect your application and validate configuration. Now we’re + focusing on something even more critical: Environm... +coverImage: null +legacyId: '1154675066987118593' +--- + +\# Introduction In our previous deep dives, we explored how the Wheels CLI helps you inspect your application and validate configuration. Now we’re focusing on something even more critical: # Environment management. Modern applications don’t run in just one mode. They operate across: \* development \* testing \* staging \* production \* maintenance Managing these environments safely and consistently is essential — especially in Wheels 3.x. This article explores five powerful environment-focused commands: \* wheels environment set \* wheels environment show \* wheels environment merge \* wheels environment switch \* wheels environment validate These commands are about control, safety, and clarity. Because in real-world development, environment mistakes are expensive. # Why Environment Management Matters Environment confusion causes real problems: \* Debug mode accidentally enabled in production \* Production database credentials used locally \* Caching disabled in staging \* Environment variables not loaded correctly \* CI/CD pipelines pointing to the wrong configuration These mistakes aren’t code issues. They’re environment issues. The new environment commands in Wheels CLI are designed to prevent exactly that. # wheels environment show \*\*See Your Active Environment Instantly\*\* \`wheels environment show\` This command tells you: \* Which environment is currently active \* How it was detected \* Which configuration files are being loaded \* Relevant environment variables No guessing. No assumptions. If something feels “off,” this is your first command. \*\*Why environment show Is Important\*\* You might think you're in staging. But are you really? Running: \`wheels environment show\` Confirms it immediately. This prevents: \* Accidental deployments \* Incorrect database connections \* Misaligned debugging settings Clarity before action. # wheels environment set \*\*Explicitly Define Your Environment\*\* \`wheels environment set staging\` This command allows you to explicitly define the active environment. Instead of relying only on system variables or automatic detection, you can directly control it. \*\*When to Use environment set\*\* \* Preparing for deployment \* Testing production-like behavior locally \* Simulating staging configuration \* Overriding default detection temporarily It gives you precision. \*\*Why It Matters\*\* Sometimes environment detection depends on: \* Server variables \* Hostnames \* System environment variables \* CI/CD configuration If those aren’t set correctly, unexpected behavior occurs. \*\*environment set\*\* eliminates uncertainty. You choose the environment. # wheels environment switch \*\*Seamlessly Move Between Environments\*\* \`wheels environment switch production\` While \*\*set\*\* defines the environment, \*\*switch\*\* is optimized for fast transitions during development workflows. Think of it as: \* Quick toggling between dev and staging \* Testing configuration differences \* Reproducing environment-specific bugs \*\*Real-World Scenario\*\* You discover a bug that only happens in production. Instead of deploying blindly: \`wheels environment switch production\` Now your local app mirrors production behavior. You debug confidently. Then switch back: \`wheels environment switch development\` Fast. Controlled. Safe. # wheels environment merge \*\*Combine Environment Configurations\*\* \`wheels environment merge staging production\` The \`merge\` command allows you to merge configuration values from one environment into another. This is powerful during: \* Preparing staging to match production \* Promoting tested configuration forward \* Synchronizing environment improvements \*\*Why environment merge Is Powerful\*\* Instead of manually copying configuration changes: \* It standardizes updates \* Reduces human error \* Ensures consistency \* Speeds up promotion workflows This is especially useful in structured release processes. Example Workflow 1. Test new config in staging 2. Validate everything works 3. Run: \`wheels environment merge staging production\` Now production inherits the verified configuration. Clean promotion. Less risk. # wheels environment validate \*\*Protect Against Environment Mistakes\*\* \`wheels environment validate\` This command checks: \* Required environment variables exist \* Critical settings are properly defined \* Production safeguards are enabled \* No unsafe debug flags are active \* Database connections match expectations Think of it as an environment safety audit. \*\*When to Use environment validate\*\* Before Deployment Always run: \`wheels environment validate\` Especially before production deployments. It can prevent: \* Debug mode in production \* Missing secret keys \* Incorrect datasource names \* Disabled caching \*\*During CI/CD Pipelines\*\* Add it to your automated workflow. If validation fails, deployment stops. That’s modern DevOps discipline. # How These Commands Work Together Here’s a safe environment workflow: Step 1 – Confirm Current Environment \`wheels environment show\` Step 2 – Switch if Necessary \`wheels environment switch staging\` Step 3 – Validate Configuration \`wheels environment validate\` Step 4 – Merge Approved Changes \`wheels environment merge staging production\` Step 5 – Explicitly Set for Deployment \`wheels environment set production\` This structured approach prevents environment chaos. # The Bigger Evolution of Wheels CLI Earlier CLI generations focused heavily on: \* Generating models \* Creating controllers \* Scaffolding applications Wheels 3.x is evolving beyond scaffolding. It now emphasizes: \* Observability \* Configuration management \* Environment safety \* Deployment confidence Modern development isn’t just about writing code. It’s about managing complexity. And environments are a major source of that complexity. These commands bring order to it. # What This Means for Wheels Developers With \*\*set\*\*, \*\*show\*\*, \*\*merge\*\*, \*\*switch\*\*, and \*\*validate\*\*, you gain: \* Explicit environment control \* Faster debugging \* Safer deployments \* Cleaner promotion workflows \* Reduced configuration drift \* Stronger team collaboration Environment mistakes are subtle — but costly. These commands dramatically reduce that risk. # Conclusion The new environment commands in Wheels CLI 3.x transform how you manage application modes. \* environment show gives clarity \* environment set gives control \* environment switch gives speed \* environment merge gives consistency \* environment validate gives safety If earlier CLI commands helped you build faster… And inspection commands helped you debug smarter… These environment tools help you deploy safer. And in modern software development, safe environments mean stable applications. Stay tuned — more deep dives into Wheels CLI are coming. diff --git a/web/content/blog/posts/wheels-cli-essentials-inspect-your-app-with-about-get-commands.md b/web/content/blog/posts/wheels-cli-essentials-inspect-your-app-with-about-get-commands.md new file mode 100644 index 0000000000..259d120a70 --- /dev/null +++ b/web/content/blog/posts/wheels-cli-essentials-inspect-your-app-with-about-get-commands.md @@ -0,0 +1,21 @@ +--- +title: 'Wheels CLI Essentials: Inspect Your App with about & get Commands' +slug: wheels-cli-essentials-inspect-your-app-with-about-get-commands +publishedAt: '2026-02-23T19:20:23.626Z' +updatedAt: '2026-02-26T19:18:30.648Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - wheels-cli + - cli-command +categories: + - CLI +excerpt: >- + \ Introduction In our previous article, \Wheels CLI: Modern Commands for + Faster, Smarter Wheels 3.0 + Development\(https://wheels.dev/blog/wheels-cli-modern-commands-for-faster-smarter-wheels-3-0-dev... +coverImage: null +legacyId: '1152697052871000065' +--- + +\# Introduction In our previous article, \[Wheels CLI: Modern Commands for Faster, Smarter Wheels 3.0 Development\](https://wheels.dev/blog/wheels-cli-modern-commands-for-faster-smarter-wheels-3-0-development), we introduced the new generation of CLI capabilities coming to Wheels 3.x. That article focused on the big picture — how the CLI is evolving beyond scaffolding into a complete development companion. Now it’s time to zoom in. This article explores three powerful inspection commands that help you understand your application’s current state instantly: \* wheels about \* wheels get environment \* wheels get settings These commands are not about generating code. They’re about visibility, awareness, and confidence. When debugging, deploying, or supporting an application, knowing your environment and configuration matters just as much as writing good code. # Why App Inspection Commands Matter Modern development environments are rarely simple. You may have: \* Multiple environments (development, staging, production) \* Different configuration overrides \* Environment-specific settings \* Multiple framework versions across projects \* Team members working on different machines Without proper visibility, confusion happens quickly. Questions like: \* “Which environment am I in?” \* “Is caching enabled here?” \* “Why is this behaving differently in staging?” \* “What version of Wheels is this app using?” The new CLI inspection commands answer these instantly. \* No digging through files. \* No guessing. \* No assumptions. Just clarity. # wheels about \*\*Your Application’s Full Snapshot\*\* The about command provides a complete overview of your Wheels application. \`wheels about\` It displays: \* Wheels framework version \* CFML engine information \* Application name \* Current environment \* Configuration status \* Key runtime details \* Application statistics Think of it as your application’s diagnostic summary. \*\*When to Use about\*\* Debugging Issues: If something behaves unexpectedly, start with: \`wheels about\` You’ll quickly see: \* Whether you’re in the correct environment \* Which framework version is running \* Whether configuration values are being picked up properly Support & Collaboration: When helping a teammate, the first question often is: “What version are you running?” Instead of manually checking files, they can simply run: \`wheels about\` It standardizes the way teams share environment information. Deployment Validation: After deploying to staging or production, you can verify: \* Correct environment detection \* Correct configuration loading \* Framework version consistency It’s a fast sanity check before declaring deployment success. Why about Is Powerful: \* Reduces troubleshooting time \* Prevents environment confusion \* Makes support conversations easier \* Encourages environmental awareness It’s your first command when something feels “off.” # wheels get environment \*\*Know Exactly Where You Are\*\* Modern apps typically run in multiple environments: \* development \* testing \* staging \* production \* maintenance The get environment command tells you exactly which one your app is currently using. \`wheels get environment\` \*\*What It Shows\*\* \* Active environment name \* How it was detected \* Where the configuration is coming from This eliminates guesswork. No more manually inspecting configuration files. \*\*Why This Is Important\*\* Environment mismatches are one of the most common causes of bugs. For example: \* Caching enabled in staging but not locally \* Different database connections \* Different mail server settings \* Debug mode accidentally enabled in production Instead of wondering, just run: \`wheels get environment\` Instant clarity. \*\*Real-World Scenario\*\* Imagine deploying to staging and noticing unexpected behavior. You assume it’s running in staging. But what if the environment variable wasn’t set correctly? Running: \`wheels get environment\` Immediately confirms whether your assumption is correct. This command alone can save hours of debugging. # wheels get settings \*\*Inspect Your Active Configuration\*\* The get settings command shows the current Wheels application settings for your active environment. \`wheels get settings\` It displays: \* All active configuration values \* Default settings \* Custom overrides \* Environment-specific configurations You can also filter for specific settings if needed. \*\*Why This Command Is Critical\*\* Configuration issues are subtle. Sometimes: \* A setting exists in one environment but not another \* A default value is overriding a custom one \* A configuration file isn’t being loaded as expected Instead of manually opening multiple config files, this command aggregates everything into one clear output. \*\*Practical Use Cases\*\* Troubleshooting: If something related to caching, sessions, or routing behaves differently: \`wheels get settings\` You’ll immediately see: \* What’s enabled \* What’s disabled \* What values are active Configuration Validation: Before going live: \* Confirm debugging is disabled \* Confirm production caching is enabled \* Confirm mail settings are correct \* Confirm custom overrides are loaded This command provides verification without manual inspection. The Bigger Picture: These commands represent an important shift in the CLI philosophy. Older CLI commands focused on generating files. These new commands focus on observability and awareness. They help you: \* Understand your app \* Validate your configuration \* Debug faster \* Avoid environment confusion \* Collaborate more efficiently In modern development, visibility is productivity. # How These Commands Work Together Here’s a practical workflow: \*\*Step 1 – Confirm Environment\*\* \`wheels get environment\` Make sure you're in the expected environment. \*\*Step 2 – Inspect Configuration\*\* \`wheels get settings\` Verify important configuration values. \*\*Step 3 – Full Diagnostic Overview\*\* \`wheels about\` Review the full application snapshot. Together, they provide a complete picture of your application’s runtime state. # What This Means for Wheels Developers With these inspection tools, Wheels CLI is evolving into more than just a scaffolding tool. It’s becoming: \* A diagnostic assistant \* A configuration validator \* An environment inspector \* A debugging companion And this is just the beginning. In upcoming articles, we’ll continue exploring: \* Environment management tools \* Database utilities \* Testing automation commands \* Asset workflows \* Documentation generation \* Advanced plugin tooling Each module builds toward one goal: \* More control. \* More clarity. \* More confidence. # Conclusion The new inspection commands in Wheels CLI 3.x are small in size — but huge in impact. \* wheels about gives you a full application snapshot \* wheels get environment removes environment guesswork. \* wheels get settings exposes active configuration instantly. If earlier CLI commands helped you build faster… These help you debug smarter. And in modern development, smart debugging is just as important as fast coding. Stay tuned — the next deep dive is coming. Learn more here: https://www.youtube.com/watch?v=NHx3-wncyFw diff --git a/web/content/blog/posts/wheels-cli-matures-to-version-1-0.md b/web/content/blog/posts/wheels-cli-matures-to-version-1-0.md new file mode 100644 index 0000000000..7948b2337c --- /dev/null +++ b/web/content/blog/posts/wheels-cli-matures-to-version-1-0.md @@ -0,0 +1,33 @@ +--- +title: Wheels CLI matures to Version 1.0 +slug: wheels-cli-matures-to-version-1-0 +publishedAt: '2022-06-20T07:07:29.000Z' +updatedAt: '2025-05-19T22:32:01.000Z' +author: Peter Amiri +tags: [] +categories: + - CLI + - Community + - Releases +excerpt: >- + It's hard to believe it took so long to get here but modern CFML development + has come a long way thanks to tools like + CommandBox(https://www.ortussolutions.com/products/commandbox) and + ForgeBox(htt... +coverImage: null +legacyId: '122' +--- + +It's hard to believe it took so long to get here but modern CFML development has come a long way thanks to tools like [CommandBox](https://www.ortussolutions.com/products/commandbox) and [ForgeBox](https://www.forgebox.io). The Wheels CLI is built as a CommandBox module and wouldn't have even been possible without the support of the fine folks at [Ortus Solutions](https://www.ortussolutions.com). + +The first commit to the repo for this project was committed back in July of 2016. It's taken a while, that's an understatement, to get here but Wheels itself jumped to 2.0, CommandBox matured, and we were able to put the plumbing in place to support the communication between the CLI and the running server. With nearly 300 commits in the repo, 25 commands in the CLI, and over 20 pages of documentation, it's now time to take the alpha/beta label off send this baby out into the world. + +Some of the more notable commands are `wheels new` to use our wizard to start a brand new project. With this command and the corresponding `wheels generate app` command, you can start a new Wheels project in a directory, specify the template to use, pick the CF engine to use, configure the datasource, and setup your reload password. In fact there's a whole host of `generate` commands for every type of object you may want to create. There are a bunch of `dbmigrate` commands to interact with database migrations. + +To install the CLI issue the following command: + +``` +box install cfwheels-cli +``` + +Don't forget to check out the full [CLI Commands](https://guides.cfwheels.org/cfwheels-guides/command-line-tools/cli-commands) section in the guides too. diff --git a/web/content/blog/posts/wheels-cli-modern-commands-for-faster-smarter-wheels-3-0-development.md b/web/content/blog/posts/wheels-cli-modern-commands-for-faster-smarter-wheels-3-0-development.md new file mode 100644 index 0000000000..5711ee767d --- /dev/null +++ b/web/content/blog/posts/wheels-cli-modern-commands-for-faster-smarter-wheels-3-0-development.md @@ -0,0 +1,23 @@ +--- +title: 'Wheels CLI: Modern Commands for Faster, Smarter Wheels 3.0 Development' +slug: wheels-cli-modern-commands-for-faster-smarter-wheels-3-0-development +publishedAt: '2026-02-17T22:17:38.210Z' +updatedAt: '2026-02-17T22:17:38.236Z' +author: Zain Ul Abideen +tags: + - cli + - wheels-3-0 + - wheels-cli + - devops +categories: + - CLI + - Documentation +excerpt: >- + \ Introduction In our previous article, we explored the classic Wheels CLI + commands that have supported Wheels developers for years and continue to work + in Wheels 3.x. Those commands helped develop... +coverImage: null +legacyId: '1151033207156506627' +--- + +\# Introduction In our previous article, we explored the classic Wheels CLI commands that have supported Wheels developers for years and continue to work in Wheels 3.x. Those commands helped developers scaffold faster, manage resources, and speed up everyday development. But Wheels 3.x is introducing something bigger. A new generation of CLI commands is arriving — designed for modern development workflows where automation, environment control, testing, and observability matter more than ever. Instead of being just a scaffolding helper, the Wheels CLI is evolving into a complete development companion. This article is not a deep dive into every command yet. Think of it as a preview of what’s coming and how it will change the way you work with Wheels. In upcoming articles, we’ll cover each area in detail — step by step. # Why This Matters for Modern Development Today’s applications demand more than just CRUD generators. Teams now expect: - Environment-aware configuration - Automated testing pipelines - Built-in diagnostics - Asset optimization - Documentation support - Plugin lifecycle management - Consistent DevOps workflows Wheels 3.x CLI is moving in this direction. The goal is simple: less manual work, fewer surprises, and more confidence in every stage of development. # What’s Changing in Wheels CLI 3.x The new CLI commands are being designed around key areas like: - Environment & configuration management - Testing and quality automation - Asset handling - Documentation generation - Plugin lifecycle tooling - Code analysis and performance insights Rather than learning everything at once, we’ll explore these in focused articles. Each module deserves its own spotlight and practical examples. # What’s Next In the next articles, we’ll go module by module and explore: - Get commands - Config tools - Env management - Db utilities - Assets workflows - Docs generation - Test automation - Docker commands - Advanced plugin tooling Each guide will include real-world usage, tips, and scenarios where these commands shine. # Closing Note Wheels CLI 3.x represents a shift from “\*\*developer convenience\*\*” to developer empowerment. If the earlier CLI helped you move faster, this new generation aims to help you work smarter and more confidently. Stay tuned — the deep dives are coming. diff --git a/web/content/blog/posts/wheels-cli-plugin-commands-search-install-remove-init.md b/web/content/blog/posts/wheels-cli-plugin-commands-search-install-remove-init.md new file mode 100644 index 0000000000..2fe2227e57 --- /dev/null +++ b/web/content/blog/posts/wheels-cli-plugin-commands-search-install-remove-init.md @@ -0,0 +1,21 @@ +--- +title: 'Wheels CLI Plugin Commands: search, install, remove & init' +slug: wheels-cli-plugin-commands-search-install-remove-init +publishedAt: '2026-03-13T18:12:53.716Z' +updatedAt: '2026-03-13T18:12:53.743Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - wheels-cli + - cli-commands +categories: + - CLI +excerpt: >- + \ Introduction So far in this series, we’ve explored how the Wheels CLI in 3.x + helps you manage your application key points and main aspects. Now we are + discussing one of the strengths of Wheels, w... +coverImage: null +legacyId: '1157791657974759425' +--- + +\# Introduction So far in this series, we’ve explored how the Wheels CLI in 3.x helps you manage your application key points and main aspects. Now we are discussing one of the strengths of Wheels, which has always been its extensibility. With Wheels 3.x, plugin management has evolved into a complete lifecycle experience within the CLI. In earlier versions of Wheels, we already had plugin-related commands such as: \`wheels plugin list\` This allowed developers to quickly see which plugins were installed inside an application and verify their presence. However, installation and management were still largely manual processes. Plugins allow you to: \* Add reusable functionality \* Share common solutions across project \* Integrate third-party services \* Extend framework behavior \* Standardize patterns across teams The framework now provides structured commands to discover, install, remove, and even scaffold plugins — all without leaving your terminal. The CLI now supports: \`\`\` wheels plugins search wheels plugins install wheels plugins remove wheels plugins init \`\`\` This shift brings several advantages: \* Centralized plugin discovery \* Consistent installation across teams \* Clean and safe removal \* Faster onboarding for new developers \* Ability to scaffold reusable internal plugins \* Reduced manual file handling errors Instead of manually downloading, copying, and configuring plugin folders, everything can now be managed directly from the CLI. What used to be a manual setup task is now a structured, repeatable workflow — aligned with modern development practices. # Why Plugin CLI Commands Matter Traditionally, managing plugins meant: \* Searching documentation or GitHub manually \* Downloading zip files \* Copying folders into /plugins \* Managing dependencies manually \* Removing plugins by deleting directories This process was: \* Inconsistent \* Error-prone \* Hard to standardize across teams The new CLI plugin commands bring: \* Discoverability \* Automation \* Clean installation \* Safe removal \* Scaffolding for new plugins It makes plugin management modern and developer-friendly. # wheels plugins search \*\*Discover Available Plugins\*\* \`wheels plugins search authenticateThis\` This command lets you search for available plugins by keyword. Instead of browsing repositories manually, you can: \* Search by functionality \* Explore plugin descriptions \* See available versions \* Identify compatible plugins \*\*When to Use It\*\* \* Looking for caching solutions \* Searching for authentication helpers \* Exploring logging enhancements \* Finding integrations (payment, email, etc.) It turns plugin discovery into a quick CLI action instead of a research task. # wheels plugins install \*\*Install Plugins Cleanly\*\* \`wheels plugins install authenticateThis\` This command: \* Downloads the plugin \* Places it in the correct directory \* Handles necessary setup steps \* Registers it properly within the app No manual folder copying. No guesswork. \*\*Benefits\*\* \* Standardized installation \* Reduced setup errors \* Faster onboarding \* Clear version control For teams, this is huge. Instead of sending plugin files manually, you simply say: \`“Run wheels plugins install xyz.”\` Consistent. Repeatable. Clean. # wheels plugins remove \*\*Remove Plugins Safely\*\* \`wheels plugins remove authenticateThis\` Instead of manually deleting plugin directories and hoping nothing breaks, this command: \* Removes the plugin cleanly \* Updates internal references \* Keeps the application structure organized \*\*Why This Matters\*\* Manual removal can leave: \* Unused config entries \* Stray files \* Broken dependencies The CLI ensures a structured uninstall process. Cleaner codebase. Less technical debt. # wheels plugins init \*\*Scaffold Your Own Plugin\*\* \`wheels plugins init myCustomPlugin\` This command creates the basic structure for a new plugin. It generates: \* Required directories \* Boilerplate files \* Plugin configuration \* Proper structure following Wheels conventions \*\*Why This Is Powerful\*\* If your team builds reusable features across multiple apps: \* Custom validation logic \* Shared integrations \* Common business utilities \* Internal framework extensions You can now package them as plugins easily. Instead of copying code between projects, you create a proper plugin once — and reuse it everywhere. # Real-World Workflow Example \*\*Discover a Plugin\*\* \`wheels plugins search i18n\` \*\*Install It\*\* \`wheels plugins install wheels-i18n\` \*\*Confirm Installation\*\* \`wheels plugin list\` \*\*Remove If No Longer Needed\*\* \`wheels plugins remove wheels-i18n\` \*\*Build Your Own\*\* \`wheels plugins init companyAuth\` Everything stays structured and reproducible. # Team & CI/CD Benefits These commands support: \* Faster onboarding \* Standardized project setup \* Automated plugin installation in pipelines \* Cleaner version control \* Reduced manual steps For example, in CI: \`wheels plugins install paymentGateway\` The environment is ready instantly. # The Bigger Evolution of Wheels CLI In older versions, plugin management was mostly manual, with only listing support available. Wheels 3.x expands that capability into: \* Plugin discovery \* Automated installation \* Structured removal \* Plugin scaffolding This reflects a broader philosophy shift: The CLI is no longer just for generating controllers and models. It’s becoming: \* A project manager \* A dependency manager \* An automation tool \* A development assistant # What This Means for Wheels Developers With search, install, remove, init, and plugin list, you gain: \* Faster project setup \* Cleaner dependency management \* Better reusability \* Stronger team consistency \* Simplified maintenance Plugins are no longer “extra files.” They are first-class components of your application architecture. And the CLI treats them that way. # Conclusion The Wheels CLI plugin commands in 3.x modernize how developers extend their applications. \* \`plugins search\` → Discover functionality \* \`plugins install\` → Add it cleanly \* \`plugins remove\` → Remove it safely \* \`plugins init\` → Build your own \* \`plugin list\` → Track what’s installed If database commands help you manage data… If testing commands help you ensure quality… Plugin commands help you extend your app intelligently. And in modern development, intelligent extensibility is everything. Stay tuned — more Wheels CLI deep dives are coming. diff --git a/web/content/blog/posts/wheels-cli-testing-commands-run-all-unit-integration-watch-coverage.md b/web/content/blog/posts/wheels-cli-testing-commands-run-all-unit-integration-watch-coverage.md new file mode 100644 index 0000000000..ee27cbc93e --- /dev/null +++ b/web/content/blog/posts/wheels-cli-testing-commands-run-all-unit-integration-watch-coverage.md @@ -0,0 +1,21 @@ +--- +title: 'Wheels CLI Testing Commands: run, all, unit, integration, watch & coverage' +slug: wheels-cli-testing-commands-run-all-unit-integration-watch-coverage +publishedAt: '2026-03-09T18:34:28.516Z' +updatedAt: '2026-03-09T18:43:04.889Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - wheels-cli + - cli-commands +categories: + - CLI +excerpt: >- + \ Introduction In previous articles, we explored how the Wheels CLI helps you + manage environments, configuration, and databases safely in Wheels 3.x. Now + we’re stepping into one of the most critica... +coverImage: null +legacyId: '1156663438686814212' +--- + +\# Introduction In previous articles, we explored how the Wheels CLI helps you manage environments, configuration, and databases safely in Wheels 3.x. Now we’re stepping into one of the most critical parts of modern development: # Testing automation. Writing tests is important. Running them consistently, efficiently, and intelligently is even more important. Whether you're: \* Fixing a bug \* Refactoring a model \* Building a new feature \* Reviewing a pull request \* Preparing for deployment \* Running CI/CD pipelines You need fast, reliable test execution. That’s where the Wheels CLI testing commands come in: \`\`\` wheels test run wheels test all wheels test unit wheels test integration wheels test watch wheels test coverage \`\`\` These commands transform testing from a manual step into a structured development workflow. # Why CLI-Based Testing Matters Without proper CLI testing tools, developers often: \* Run tests inconsistently \* Forget to run certain test suites \* Skip integration tests \* Manually check coverage \* Run full test suites unnecessarily \* Waste time rerunning everything The Wheels CLI standardizes test execution. It makes testing: \* Repeatable \* Targeted \* Automated \* CI-friendly \* Developer-friendly Testing becomes part of your daily workflow — not a separate task. # wheels test run Run Tests Quickly \`wheels test run\` This is your primary test execution command. It runs your default configured test suite. Use it when: \* You’ve made changes \* You’re about to commit \* You’re verifying a bug fix \* You’re checking regression impact It’s your go-to command for daily development. # wheels test all \*\*Execute Everything\*\* \`wheels test all\` This runs: \* Unit tests \* Integration tests \* Full application tests Use it when: \* Preparing for deployment \* Running CI builds \* Verifying a major refactor \* Ensuring full system stability This gives you complete confidence before shipping. # wheels test unit \*\*Fast, Focused Feedback\*\* \`wheels test unit\` Unit tests are: \* Fast \* Isolated \* Focused on small pieces of logic They test: \* Models \* Services \* Helpers \* Utility functions Run this when: \* Refactoring business logic \* Updating model behavior \* Testing validation rules \* Working on isolated components Unit tests provide rapid feedback. They should run in seconds. # wheels test integration \*\*Test Real Interactions\*\* \`wheels test integration\` Integration tests validate how components work together. They typically cover: \* Controller → Model interactions \* Database queries \* API endpoints \* Authentication flows \* Request lifecycles These tests are slower than unit tests — but far more comprehensive. Use them when: \* Updating controllers \* Modifying routes \* Changing database behavior \* Adjusting authentication \* Testing real request flows Integration tests protect against system-level regressions. # wheels test watch \*\*Continuous Testing During Development\*\* \`wheels test watch\` This command monitors your project files. When changes are detected, Tests automatically rerun. This creates a powerful development loop: 1. Edit code 2. Save 3. Tests rerun instantly 4. See failures immediately It encourages: \* Test-driven development (TDD) \* Faster debugging \* Immediate feedback \* Higher code quality No more manually re-running tests after every change. # wheels test coverage \*\*Measure Code Coverage\*\* \`wheels test coverage\` Running tests is good. Knowing what they actually cover is better. This command generates a coverage report showing: \* Percentage of code covered \* Untested files \* Uncovered lines \* Weak testing areas Coverage helps you: \* Identify missing test cases \* Improve test completeness \* Strengthen critical components \* Enforce quality standards It transforms testing from reactive to strategic. # How These Commands Work Together Here’s a modern development workflow: \*\*Daily Development\*\* \`wheels test unit\` Fast feedback while coding. \*\*After Feature Completion\*\* \`wheels test integration\` Validate system behavior. \*\*Before Commit\*\* \`wheels test run\` Quick verification. \*\*Before Deployment\*\* \`\`\` wheels test all wheels test coverage \`\`\` Full confidence check. \*\*During Active Development\*\* \`wheels test watch\` Continuous feedback loop. Each command serves a specific purpose. Together, they create a complete testing ecosystem. # CI/CD Integration These commands are designed to work seamlessly in pipelines: \*\*wheels test all || exit 1\*\* If tests fail, deployment stops. Add coverage thresholds for quality enforcement: \* Require minimum coverage percentage \* Block deployment if below standard \* Track coverage trends over time This makes testing not just a developer tool — but a deployment safeguard. # The Bigger Picture Older CLI tools focused mainly on scaffolding and generation. Wheels 3.x CLI emphasizes: \* Observability \* Environment safety \* Configuration validation \* Database lifecycle management \* Automated testing Testing commands elevate the CLI into a full development companion. Modern development requires: \* Fast iteration \* Automated validation \* Confidence before release \* Clear quality metrics These testing commands deliver exactly that. # What This Means for Wheels Developers With \*\*run\*\*, \*\*all\*\*, \*\*unit\*\*, \*\*integration\*\*, \*\*watch\*\*, and \*\*coverage\*\*, you gain: \* Faster debugging cycles \* Stronger code quality \* Safer refactoring \* CI-ready workflows \* Continuous feedback \* Measurable quality standards Testing stops being optional. It becomes integrated. And when testing becomes effortless, quality naturally improves. # Conclusion The Wheels CLI testing commands in 3.x bring structure and power to your development workflow: \* \`test run\` → Quick verification \* \`test all\` → Full system validation \* \`test unit\` → Fast, focused checks \* \`test integration\` → Real-world confidence \* \`test watch\` → Continuous feedback \* \`test coverage\` → Quality measurement If database commands help you manage data… If environment commands help you deploy safely… Testing commands help you build with confidence. And in modern development, confidence is everything. Stay tuned — more Wheels CLI deep dives are coming. https://youtu.be/L2Z5bxcgVwE diff --git a/web/content/blog/posts/wheels-cli-the-hidden-productivity-booster-for-wheels-developers.md b/web/content/blog/posts/wheels-cli-the-hidden-productivity-booster-for-wheels-developers.md new file mode 100644 index 0000000000..fbdd786543 --- /dev/null +++ b/web/content/blog/posts/wheels-cli-the-hidden-productivity-booster-for-wheels-developers.md @@ -0,0 +1,74 @@ +--- +title: 'Wheels CLI: The Hidden Productivity Booster for Wheels Developers' +slug: wheels-cli-the-hidden-productivity-booster-for-wheels-developers +publishedAt: '2026-02-16T21:57:25.337Z' +updatedAt: '2026-02-16T21:57:25.345Z' +author: Zain Ul Abideen +tags: + - wheels-cli + - cli + - cli-commands + - productivity +categories: [] +excerpt: >- + \ Introduction Wheels Framework is already known for rapid development, but + when combined with the \Wheels CLI\(/guides/command-line-tools/cli-overview), + productivity increases dramatically. Many d... +coverImage: null +legacyId: '139' +--- + +\# Introduction Wheels Framework is already known for rapid development, but when combined with the \[Wheels CLI\](/guides/command-line-tools/cli-overview), productivity increases dramatically. + +Many developers either don’t use the CLI often or don’t fully explore its capabilities. That’s a missed opportunity — because the CLI is one of the biggest workflow accelerators in the Wheels ecosystem. + +This article focuses on the classic Wheels CLI commands — the ones that have been around for a long time and are still fully functional in Wheels 3.0. While Wheels 3.0 introduces new tooling and improvements (which we’ll cover in the next article), these commands remain reliable and widely used. + +They are powerful for: \* Bootstrapping projects \* Scaffolding entities \* Managing database migrations \* Generating code \* Handling plugins \* Speeding up daily development tasks If you’re maintaining existing projects or want to master the foundations first, these commands are essential. + +\# What is Wheels CLI? Wheels CLI is a command-line toolkit that automates repetitive tasks in Wheels applications. Instead of manually creating files, writing boilerplate code, or managing database changes, you can do it in seconds using simple commands. It promotes convention, structure, and repeatability across projects. + +Benefits: \* Less manual work \* Fewer mistakes \* Consistent structure \* Faster onboarding for new developers \* Rapid prototyping # Quick Start Guide You can get started with Wheels CLI in just a few minutes. Prerequisites: \* CommandBox 5.0+ \* Java 17+ \* Database (MySQL, PostgreSQL, SQL Server, Oracle, SQLite, or H2) # Installation Wheels CLI runs on CommandBox, so you need CommandBox installed first. CommandBox is a CLI tool for CFML that helps you manage: \* Servers \* Packages \* Dependencies \* Frameworks like Wheels. You can follow the official \[quick start guide\](https://wheels.dev/guides/command-line-tools/quick-start). This guide shows how to install CommandBox and set up the Wheels CLI. Once CommandBox is installed, you can use Wheels CLI commands inside your project directory. + +\# Classic Wheels CLI Commands (Still Working in Wheels 3.0) These commands form the backbone of many Wheels workflows and remain supported in Wheels 3.0. # 1. Wheels Init \`wheels init\` +Bootstrap an existing Wheels application for CLI usage. The wheels init command initializes an existing Wheels application to work with the Wheels CLI. It's an interactive command that helps set up necessary configuration files (box.json and server.json) for an existing Wheels installation. + +Great for: \* Starting fresh projects \* Standardizing setups across teams # 2. Wheels Info \`wheels info\` +The wheels info command displays information about the Wheels CLI module and identifies the Wheels framework version in the current directory. + +Helpful for: \* Debugging \* Checking versions \* Environment awareness # 3. Wheels Reload \`wheels reload\` +The wheels reload command reloads your Wheels application, clearing caches and reinitializing the framework. This is useful during development when you've made changes to configuration, routes, or framework settings. Note: the server must be running for this command to work. + +Useful when: \* Updating configs \* Testing changes quickly \* Developing actively # 4. Wheels Deps \`wheels deps\` +The wheels deps command provides a streamlined interface for managing your Wheels application's dependencies through box.json. It integrates with CommandBox's package management system while providing Wheels-specific conveniences. It manages application dependencies using box.jsons. + +\# 5. Wheels Destroy The wheels destroy command removes all files and code associated with a resource that was previously generated. It's useful for cleaning up mistakes or removing features completely. This command will also drop the associated database table and remove resource routes. + +Example: +\`wheels destroy model User\` +Useful when: \* Refactoring \* Cleaning prototypes \* Undoing mistakes # 6. Wheels Generate This is where the magic happens. The Wheels generate command is a productivity-focused code generator that creates common application components following Wheels conventions. + +It helps you scaffold structured, ready-to-use code so you don’t have to write repetitive boilerplate manually. Everything it generates aligns with Wheels’ MVC patterns and naming conventions. This makes your codebase consistent and easier to maintain, especially in team environments. + +It works by creating files and wiring up basic functionality automatically, allowing developers to focus on business logic instead of setup. +\*\*Generators:\*\* \* app-wizard \* app \* controller \* model \* property \* route \* scaffold \* code \* snippets \* test \* view Example +\`wheels generate scaffold post title:string body:text\` +This generates: \* Model \* Controller \* Views \* Routes \* CRUD setup Huge time saved! + +\# 7. Wheels DBMigrate The wheels dbmigrate command provides a structured way to manage database schema changes using migrations. Instead of manually editing databases, you define changes in migration files that can be version-controlled, shared with teams, and safely executed across environments. It brings modern migration workflows (similar to Rails or Laravel) into Wheels development. Each migration has an up and down path, allowing safe rollbacks when needed. + +\*\*Commands:\*\* \* wheels dbmigrate up \* wheels dbmigrate down \* wheels dbmigrate reset \* wheels dbmigrate latest \* wheels dbmigrate info \* wheels dbmigrate exec \* wheels dbmigrate create blank \* wheels dbmigrate create table \* wheels dbmigrate create column \* wheels dbmigrate remove table \*\*Why It’s Useful\*\* +\* Version-controlled DB schema \* Safe rollbacks \* Team collaboration friendly \* Easier deployments \*\*Example\*\* +\`Wheels dbmigrate create table users\` +\`Wheels dbmigrate up\` +Boom — your table is created and tracked. + +\# 8. Wheels Plugins List \`wheels plugins list\` The plugins list command displays information about Wheels plugins. By default, it shows plugins installed locally in the /plugins folder. With the --available flag, it queries ForgeBox to show all available cfwheels-plugins packages. + +\*\*Encourages:\*\* +\* Reusability \* Modular development \* Faster feature addition # Important Note on Wheels 3.0 All commands covered in this article are classic commands that continue to work in Wheels 3.0. They are stable, trusted, and widely used in real-world projects. Many production applications still rely on them daily. +However, Wheels 3.0 also introduces new CLI capabilities and improvements designed for modern workflows. +In the next article, we’ll explore the new and enhanced CLI commands introduced in Wheels 3.0, how they differ, and when to use them. + +\# Conclusion The Wheels CLI is not just a convenience — it's a productivity multiplier. +Developers who adopt CLI-driven workflows: \* Ship faster \* Maintain cleaner projects \* Reduce repetitive tasks \* Focus more on business logic Mastering these classic commands gives you a strong foundation before moving on to the newer 3.0 features. diff --git a/web/content/blog/posts/wheels-dev-goes-public-a-production-wheels-3-0-application-you-can-actually-study.md b/web/content/blog/posts/wheels-dev-goes-public-a-production-wheels-3-0-application-you-can-actually-study.md new file mode 100644 index 0000000000..812ef022d9 --- /dev/null +++ b/web/content/blog/posts/wheels-dev-goes-public-a-production-wheels-3-0-application-you-can-actually-study.md @@ -0,0 +1,28 @@ +--- +title: >- + wheels.dev Goes Public: A Production Wheels 3.0 Application You Can Actually + Study +slug: >- + wheels-dev-goes-public-a-production-wheels-3-0-application-you-can-actually-study +publishedAt: '2026-03-05T14:00:00.000Z' +updatedAt: '2026-03-04T00:53:06.560Z' +author: Peter Amiri +tags: + - launch + - open-source + - wheels-dev + - production + - docker-swarm +categories: + - Community + - Releases + - Website +excerpt: >- + Most framework documentation tells you \how\ to build something. The Wheels + community site at wheels.dev is something different -- it's a production + application built with Wheels 3.0 that you can a... +coverImage: null +legacyId: '1151027108231184385' +--- + +Most framework documentation tells you \*how\* to build something. The Wheels community site at wheels.dev is something different -- it's a production application built with Wheels 3.0 that you can actually look at, poke around, and learn from. We've made the source public, and this article walks through how the site is built, how it's deployed, and how it comes to life inside a Docker Swarm. ## Why Make the Site Public? Framework examples tend to be toy applications. They show you the syntax but not the patterns. They demonstrate a feature in isolation but never show you how thirty features work together in something real. wheels.dev is a real application with real users. It has a blog system with moderation workflows, user authentication with role-based access control, a documentation viewer, newsletter management, an admin dashboard, and a full API layer. It handles file uploads, session clustering across multiple replicas, transactional email, and error tracking. It's the kind of application that exposes the decisions frameworks force you to make -- and shows how Wheels 3.0 handles them. By making the source public, we're turning the community site into the most comprehensive Wheels 3.0 example that exists. ## The Architecture At its core, wheels.dev follows the MVC pattern that Wheels is built around, but scaled to production complexity. ### Models: 31 ActiveRecord Components The data layer uses Wheels' ActiveRecord ORM with 31 model components. The \`Blog\` model alone demonstrates associations (\`belongsTo\` User, \`hasMany\` Comments, Tags, Categories, and ReadingHistory), validations, callbacks, and soft deletes tracked through \`deletedAt\` and \`deletedBy\` columns. The \`User\` model handles password hashing via bcrypt, role associations, and relationships to everything a user can create or interact with. Other models handle the supporting infrastructure: \`RememberToken\` for persistent login sessions, \`PasswordReset\` for email-based recovery flows, \`LoginAttempt\` for security tracking, \`Newsletter\` and \`NewsletterSubscriber\` for email campaigns, \`Testimonial\` with an approval workflow, and \`CachedRelease\` for caching ForgeBox release data. The database runs on CockroachDB, accessed through a standard PostgreSQL JDBC driver -- CockroachDB speaks the PostgreSQL wire protocol, so Wheels connects to it like any other Postgres database. The schema is managed entirely through timestamped migration files -- over 20 of them covering 25+ tables with foreign key constraints, indexes, and referential integrity. And yes, we're dogfooding here. Wheels currently supports six databases: MySQL, PostgreSQL, SQL Server, H2, Oracle, and SQLite. Running the community site on CockroachDB is our way of putting a seventh database adapter through its paces in production. Anybody hear a seventh supported database coming? ### Controllers: Three Namespaces Controllers are organized into three distinct namespaces, each serving a different concern: - \*\*\`web.\*\`\*\* handles public-facing pages -- the homepage, blog listing and detail views, guides, documentation, community pages, and authentication flows - \*\*\`admin.\*\`\*\* powers the dashboard for content moderation, user management, settings, newsletter administration, and testimonial approval - \*\*\`api.\*\`\*\* exposes RESTful endpoints for blog content, downloads, and authentication A base \`Controller.cfc\` provides shared infrastructure: CSRF protection via \`protectsFromForgery()\`, authentication helpers, role-based access checks, and reusable query methods for fetching blogs with their associated tags, categories, and attachments. ### Routing: RESTful by Convention The routing configuration in \`config/routes.cfm\` demonstrates Wheels' mapper DSL at scale. API routes live under \`/api/v1/\` with proper REST verb mapping. The blog supports filtering by category, author, and tag through clean URLs like \`/blog/categories/\[slug\]\`. Admin routes are grouped under \`/admin/\` with consistent CRUD patterns. The guides system supports versioned paths (\`/3.0.0/guides/\[path\]\`) for serving documentation across framework releases. ### Views: Server-Rendered with HTMX The view layer uses CFML templates with a main \`layout.cfm\` that handles page titles, meta tags, and content-specific rendering. Where dynamic interactivity is needed -- loading comments, filtering blog posts, toggling UI states -- the site uses HTMX rather than a JavaScript framework. This keeps the architecture simple: the server renders HTML fragments, and HTMX swaps them into the page without full reloads. ## Features Worth Studying Several features in the codebase demonstrate patterns that go beyond what you'd find in a tutorial. ### Authentication and Session Management User authentication supports registration with email verification, login with bcrypt password hashing, and a "Remember Me" system that stores hashed tokens with user-agent validation. If someone's token doesn't match their current browser fingerprint, the token is invalidated -- a practical defense against session theft. Sessions are configured with a 2-hour timeout and a 30-minute idle logout, with session storage backed by CockroachDB so that sessions persist across container restarts and are shared across all Swarm replicas. The \`onRequestStart\` event handler checks for idle timeouts and validates remember-me tokens on every request. ### Role-Based Access Control The permission system uses a \`User -> Role -> Permission\` hierarchy. Controllers check access through methods like \`checkAdminAccess()\` and \`checkRoleAccess()\`, gating entire controller actions based on the authenticated user's role. The admin namespace uses before-filters to enforce this consistently. ### Blog Content Workflow Blog posts follow a multi-status lifecycle: Draft, Pending Approval, Approved, and Rejected. Authors create and submit posts; administrators moderate them through the admin dashboard with bulk actions. Comments have their own moderation queue. Reading history and bookmarks are tracked per user. The system generates XML sitemaps and RSS-compatible comment feeds. ### Caching Strategy The site uses a 10-minute RAM cache for frequently accessed queries and a dedicated cache for contributor data that's expensive to fetch from external sources. This caching layer is configured in \`config/app.cfm\` and works transparently with the ORM. ## How the Site is Deployed The deployment pipeline is triggered by any push to the \`main\` branch of the wheels.dev repository. Here's what happens. ### Building the Container A GitHub Actions workflow runs on a standard Ubuntu runner. It generates an environment file from encrypted GitHub Secrets -- connection details for the CockroachDB cluster, SMTP credentials for Postmark (transactional email), a Sentry DSN for error tracking, an ID salt for obfuscating database identifiers in URLs, and admin passwords. The workflow installs CommandBox (a CFML build tool and dependency manager), runs \`box install\` to pull all dependencies including the Wheels core framework, and builds a Docker image. The Dockerfile starts from \`ortussolutions/commandbox:lucee6\`, adds a PostgreSQL JDBC driver, copies in the application code and a production-tuned \`server.json\`, and disables the browser auto-launch that CommandBox includes for local development. The image is tagged with both \`:latest\` and the Git commit SHA, then pushed to GitHub Container Registry. ### Deploying to the Swarm A self-hosted GitHub Actions runner inside the Docker Swarm cluster picks up the deployment job. It authenticates with the container registry and runs \`docker stack deploy\`, which reconciles the running state with the desired state defined in \`docker-compose.yml\`. The stack deploys \*\*three replicas\*\* of the application. Rolling updates proceed one container at a time with a 15-second delay, using a start-first strategy -- the new replica must be running and healthy before the old one is removed. Rollbacks follow the same one-at-a-time pattern with a 10-second delay. Each replica gets up to 2 CPUs and 4 GB of memory, with the JVM tuned to a 2 GB minimum and 3 GB maximum heap. A Traefik reverse proxy handles load balancing and routing based on the \`Host\` header. Because sessions are stored in CockroachDB with clustering enabled, any replica can serve any request -- there's no need for sticky sessions or session affinity cookies. ### Shared Storage One of the trickier aspects of running a stateful web application across multiple replicas is file storage. Uploaded images, file attachments, generated sitemaps, versioned documentation, and API JSON responses all need to be accessible from every replica. The solution is CephFS-backed volumes mounted into each container at specific paths: \`/app/public/images\`, \`/app/public/files\`, \`/app/public/sitemap\`, \`/app/docs/3.0.0/guides\`, and \`/app/public/json\`. When a user uploads an image through replica 1, replicas 2 and 3 can serve it immediately. A separate \`/data\` volume provides general application state storage that persists across deployments. ### The Warmup Sequence This is one of the most important parts of the deployment, and it's easy to overlook. CFML applications running on the JVM suffer from cold-start latency -- the first request to any template triggers compilation, class loading, and JIT warm-up. In a user-facing application, that first request could take several seconds. The \`server.json\` configuration includes a warmup directive that fires immediately after the server starts, before it begins accepting external traffic: \`\`\` /index.cfm, /blog, /blog/list, /blog/Categories, /guides, /3.0.0/guides, /api, /api/3.0.0/, /docs, /community, /news, /downloads, /login \`\`\` These 13 URLs are hit sequentially with a 5-minute timeout window using a queued request strategy. By the time the replica joins the Swarm's load balancer rotation, every major route has been compiled, the template cache is warm, database connection pools are established, and the JVM has had a chance to JIT-compile the hot paths. The result: users never hit a cold replica. ### The Network Edge External traffic reaches the application through a Cloudflare tunnel, which handles TLS termination, DDoS protection, and edge caching. Inside the Swarm, Traefik routes requests to the three replicas over an overlay network. A middleware rule redirects \`www.wheels.dev\` to the apex \`wheels.dev\` domain. ## What Makes It a "Model" Application The term "model application" means something specific here. It's not just that wheels.dev runs on Wheels -- it's that every architectural decision in the codebase represents a recommended pattern. The controller namespacing (\`web\`, \`admin\`, \`api\`) shows how to organize a growing application. The base controller demonstrates cross-cutting concerns like authentication and CSRF protection. The model layer shows associations, validations, and soft deletes working together in a real schema. The routing configuration demonstrates RESTful conventions, versioned API paths, and clean URL patterns. The migration files show incremental schema evolution. The deployment configuration shows how a Wheels application transitions from development to production: environment-specific config overrides, container-based deployment, session clustering, shared storage, and zero-downtime updates. It's the complete picture -- not a tutorial, not a toy, but a running application that developers can study, fork, and learn from. ## Get Involved The wheels.dev source is public. Browse the code, open issues, suggest improvements, or use it as a reference for your own Wheels 3.0 projects. The repository includes a \`CLAUDE.md\` with AI-assisted development guidance and a comprehensive README to help you get oriented. If the best documentation is working code, then wheels.dev is the best Wheels 3.0 documentation we could write. diff --git a/web/content/blog/posts/wheels-hanging-with-big-boys.md b/web/content/blog/posts/wheels-hanging-with-big-boys.md new file mode 100644 index 0000000000..b6fc0c71f7 --- /dev/null +++ b/web/content/blog/posts/wheels-hanging-with-big-boys.md @@ -0,0 +1,58 @@ +--- +title: Wheels Is Hanging with the Big Boys Just Fine +slug: wheels-hanging-with-big-boys +publishedAt: '2009-12-09T09:13:42.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + Well, my first blog post for Wheels. I am Mike Henke(http://www.henke.ws/). I + fell in love with Wheels after I asked my friend Ryan + Stille(http://www.stillnetstudios.com/) what ColdFusion framework... +coverImage: null +legacyId: '2' +--- + +Well, my first blog post for Wheels. I am [Mike Henke](http://www.henke.ws/). I fell in love with Wheels after I asked my friend [Ryan Stille](http://www.stillnetstudios.com/) what ColdFusion framework he thought looked interesting and would like to learn. I always wanted to implement a CF framework at work, but business constraints (time, complexity, learning curve, priority) never worked until I found Wheels. In this entry, I will be providing some surprising and interesting stats showing how Wheels has grown over the past couple years. Here are a couple to start with: CFWheels.org had a spike of over **_500_** unique visitors and **_42 downloads_** in one day last month. ![Number of visits is starting to show an exponential trend.](https://cfwheels.org/images/blog/2009/12/9/google-analytics.png) _Traffic from past couple years (Google Analytics)_ + +## Here Are the (Surprising) Stats + +I mentioned the entry would be about stats. [Alexa data](http://www.alexa.com/siteinfo/cfwheels.org) as of 12/08/2009: + +| | Alexa Traffic Ranking | Traffic Ranking in US | +| -------------------- | --------------------- | --------------------- | +| **cfwheels.org** | **320,490** | **61,182** | +| mach-ii.com | n/a | 1,578,535 | +| coldboxframework.com | 744,890 | 332,231 | +| model-glue.com | 664,797 | 652,353 | + +Here are definitions of these metrics in case you aren't familiar: + +> Alexa Traffic Rank +> +> A measure of a website's popularity. The rank is calculated using a combinatino of average daily visitors and pageviews over the past 3 months. The site with the highest combination of visitors and pageviews is ranked #1. Updated Daily. +> +> Traffic Rank in Country +> +> A measure of a website's popularity in a specific country. The rank by country is calculated using a combination of average daily visitors and pageviews from users from that country over the past 3 months. The site with the highest combination of visitors and pageviews is ranked #1 in that country. Updated Daily. + +## Take Away + +Take away what you may from these, I think it shows how Wheels is growing and filling an area in the ColdFusion framework world. Here are some [stats from Complete.com](http://siteanalytics.compete.com/cfwheels.org+model-glue.com+coldboxframework.com/) (amongst top 3 ranking framework sites): [![](http://grapher.compete.com/cfwheels.org+model-glue.com+coldboxframework.com_uv_460.png)](http://siteanalytics.compete.com/cfwheels.org+model-glue.com+coldboxframework.com/?metric=uv) Clearly, in combination with the Alexa rankings listed earlier, CFWheels.org is being looked at, used, and is hanging with the big boys just fine. + +## Finally + +Finally, I would like to mention Wheels's Google Group. It is a great resource. + +Google Group Member Stats as of 12/07/2009 — CFML Frameworks +| Group | Members | +| --- | --- | +| FW/1 | 107 | +| **ColdFusion on Wheels** | **275** | +| ColdBox | 289 | +| Model Glue | 508 | +| Mach-II | 637 | + +Well, wrapping up my first post for Wheels. I would like to point people towards joining the [Google Group for ColdFusion on Wheels](http://groups.google.com/group/cfwheels) and getting in on the fun. diff --git a/web/content/blog/posts/wheels-round-up-2009-12-11.md b/web/content/blog/posts/wheels-round-up-2009-12-11.md new file mode 100644 index 0000000000..a77dd5b1de --- /dev/null +++ b/web/content/blog/posts/wheels-round-up-2009-12-11.md @@ -0,0 +1,37 @@ +--- +title: Wheels Round Up for 2009/12/11 +slug: wheels-round-up-2009-12-11 +publishedAt: '2009-12-11T09:10:28.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: Thanks +coverImage: null +legacyId: '1' +--- + +## Thanks + +I would like a couple hat-tips to Sean Corfield for mentioning Wheels in his blog entry about [Hal Helms leaving CFML](http://corfield.org/blog/index.cfm/do/blog.entry/entry/On_Hal_Helms_Ruby_on_Rails_and_the_Death_of_ColdFusion_and_Fusebox). And to [ColdFusion Open-Source Update](http://www.remotesynthesis.com/archives.cfm/category/open-source-cf) by Brian Rinaldi who regularly mentions Wheels along with all sorts of other CF Open Source news. Finally, Thanks to Ben Forta, yes Mr. ColdFusion himself. He [mentions Wheels 1.0 Release](http://forta.com/blog/index.cfm/2009/12/10/ColdFusion-on-Wheels-10-Released). + +## Worth Noting + +Worth noting is Ray Camden [blogs about FW/1](http://www.coldfusionjedi.com/index.cfm/2009/11/28/Framework-One). Ray mentions [FW/1](http://fw1.riaforge.org/) using [conventions over configuration](http://en.wikipedia.org/wiki/Convention_over_configuration) (CoC) which is great. Wheels uses CoC, though Wheels is not as young as FW/1. Wheels has been being developed since July 2006 and recently released the [first production ready version](https://cfwheels.org/blog/index.cfm/2009/11/24/Wheels-10-Were-Production-Ready). To see the history of Wheels development through the years [click here](http://github.com/rip747/cfwheels/graphs/impact). + +![](https://cfwheels.org/blog/images/dc2sb454_403hgm7nbz5_b.jpg) + +## Honorable Mentions + +The [CFHour podcast](http://www.cfhour.com/detail.cfm?entry=5D6782E4-E373-8A75-46B156081633B54E) mentions Hal Helms's blog post and talks about Ruby on Rails. It is nice to hear the ideas inspiring Wheels bantered about in the ColdFusion world. It shows the impact of Wheels frameworks' core principles are real and here to stay. Wheels has hit Asia with a recent post on [ChinaOnRails.com](http://chinaonrails.com/topic/view/3578.html) + +## Google Group Threads + +Here are some interesting Google Group threads going on in the [Wheels group](http://groups.google.com/group/cfwheels). + +- [Textmate bundle updates](http://groups.google.com/group/cfwheels/browse_thread/thread/625e5ee6d8fc5189) +- [Sharing Filters Between Controllers Needs to be Redesigned](http://groups.google.com/group/cfwheels/browse_thread/thread/10fe0cab576b2148) +- [Printable Reference Guide](http://groups.google.com/group/cfwheels/browse_thread/thread/0d1200d981424016) +- [Anyone know how to hack this?](http://groups.google.com/group/cfwheels/browse_thread/thread/3e813748ef8be602) +- [Printable Reference Guide](http://groups.google.com/group/cfwheels/browse_thread/thread/d1200d981424016/832093f032108aac) diff --git a/web/content/blog/posts/wheels-screencasts-continue.md b/web/content/blog/posts/wheels-screencasts-continue.md new file mode 100644 index 0000000000..4237fdebee --- /dev/null +++ b/web/content/blog/posts/wheels-screencasts-continue.md @@ -0,0 +1,24 @@ +--- +title: Wheels Screencasts Continue +slug: wheels-screencasts-continue +publishedAt: '2010-12-02T23:00:03.000Z' +updatedAt: '2025-05-19T22:32:18.000Z' +author: Mike Henke +tags: [] +categories: + - Community +excerpt: >- + If you haven't been keeping up the Wheels + Screencast(https://cfwheels.org/screencasts), now is a great time. We are up + to 10. Starting with Episode 1: Setting up ColdFusion on + Wheels(https://cfwhee... +coverImage: null +legacyId: '21' +--- + +If you haven't been keeping up the [Wheels Screencast](https://cfwheels.org/screencasts), now is a great time. We are up to 10. Starting with [Episode 1: Setting up ColdFusion on Wheels](https://cfwheels.org/screencasts/view/1) and currently ending with [Episode 10: Displaying Sets of Records](https://cfwheels.org/screencasts/view/11) in between we cover [routes](https://cfwheels.org/docs/chapter/using-routes), [flash](https://cfwheels.org/blog/index.cfm/2010/4/2/cfwheels.org/docs/chapter/using-the-flash), authentication, [object validation](https://cfwheels.org/docs/chapter/object-validation), and more. + +### Subscribe to Screencasts + +- [RSS Feed](http://feeds.cfwheels.org/cfwheels/screencasts) +- [iTunes](http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=335537994) diff --git a/web/content/blog/posts/wheels-vs-code-extension-supercharge-your-wheels-development.md b/web/content/blog/posts/wheels-vs-code-extension-supercharge-your-wheels-development.md new file mode 100644 index 0000000000..313f4d726c --- /dev/null +++ b/web/content/blog/posts/wheels-vs-code-extension-supercharge-your-wheels-development.md @@ -0,0 +1,21 @@ +--- +title: 'Wheels VS Code Extension: Supercharge Your Wheels Development' +slug: wheels-vs-code-extension-supercharge-your-wheels-development +publishedAt: '2026-02-19T17:50:00.925Z' +updatedAt: '2026-02-26T19:07:07.744Z' +author: Zain Ul Abideen +tags: + - wheels-3-0 + - vscode-extension + - productivity +categories: + - Tips & Tricks +excerpt: >- + Wheels has always focused on developer happiness and rapid productivity. But + great frameworks deserve great tools — and that’s where the \Wheels VS Code + Extension\(https://marketplace.visualstudio.... +coverImage: null +legacyId: '1151546821681741827' +--- + +Wheels has always focused on developer happiness and rapid productivity. But great frameworks deserve great tools — and that’s where the \[Wheels VS Code Extension\](https://marketplace.visualstudio.com/items?itemName=wheels-dev.wheels-vscode) comes in. This extension transforms Visual Studio Code into a Wheels-aware development environment. Instead of generic editing, you get intelligent assistance designed specifically for Wheels conventions, APIs, and workflows. The result? Less boilerplate. Fewer mistakes. Faster development. Whether you're building a new app or maintaining a large codebase, the extension helps you write cleaner code and move faster with confidence. # Why a Dedicated Wheels Extension Matters Modern development isn’t just about writing code — it’s about: \* Speed and efficiency \* Consistency across teams \* Reducing human error \* Discoverability of framework features \* Smooth onboarding for new developers The Wheels VS Code Extension addresses all of these by bringing Wheels intelligence directly into your editor. Instead of memorizing function signatures or manually creating files, the extension assists you in real time. # Key Features \*\*File Templates & Scaffolding\*\* Generate Wheels components in seconds using built-in templates that follow best practices. You can instantly scaffold: \* Controllers \* Models \* Views Each template includes common patterns like CRUD actions, validations, associations, and proper CFML structure. How It Helps: \* Eliminates repetitive setup \* Encourages consistent structure \* Saves time during project setup \* Great for onboarding juniors You can create components via: \* Right-click context menu \* Command Palette The extension also creates missing directories automatically. # Quick Code Templates Typing a short keyword expands into a full component structure. \*\*Examples:\*\* \* wcontroller → full controller template \* wmodel → full model template These templates include: \* Associations \* Validations \* Callbacks \* Common CRUD logic Perfect for rapidly building production-ready components. # Function Snippets The extension includes 300+ Wheels functions with smart snippets. You get two options: \* Basic version → only required parameters \* Full version → all available parameters Benefits: \* No more checking docs repeatedly \* Tab navigation between parameters \* Faster and more accurate coding \* Great for learning Wheels APIs # Go To Definition (F12) Instantly jump to related Wheels components. Works with: \* Models \* Controllers \* Routes \* Views Examples: \* Jump from model("User") to User.cfc \* Jump from renderView("users/show") to the view file \* Jump from routes to controller actions This is a massive time saver in large projects. # Smart Parameter System A powerful assistance system for function parameters. \*\*Parameter Highlighting\*\* See valid parameters as you type. Quickly discover available options without opening documentation. \*\*Parameter Auto-Completion\*\* Type partial names and auto-complete them instantly. Use when: \* wh → where="" \* ord → order="" This reduces typos and speeds up development. \*\*Parameter Validation\*\* The extension detects invalid parameter names in real time. If you mistype: \`findAll(ordr="name ASC")\` You’ll see a warning and a suggestion for the \*\*order\*\*. Why This Matters: \* Prevents subtle bugs \* Encourages best practices \* Helps new developers learn faster \* Improves overall code quality \*\*Hover Documentation\*\* Hover over any Wheels function to see: \* Parameters \* Types \* Defaults \* Examples \* Return values This provides instant documentation without leaving your editor. It’s especially helpful when exploring unfamiliar APIs. # Installation & Setup Getting started is simple: 1. Open Visual Studio Code 2. Go to Extensions (Ctrl+Shift+X for Windows or Cmd+Shift+X for Mac) 3. Search for Wheels 4. Install and reload No configuration required. It works immediately with CFML files. # Troubleshooting \*\*Extension Not Working?\*\* \* Ensure file language is set to CFML \* Reload the VS Code window \*\*Go To Definition Issues?\*\* \* Open your Wheels app as a workspace folder \* Follow the standard Wheels structure \* Use correct syntax like model("User") \*\*Parameter Hints Missing?\*\* \* Press Ctrl+Shift+Space or Cmd+Shift+Space for Windows and Mac respectively \* Ensure you're inside a function call \*\*Resources\*\* \* Wheels Documentation \* Wheels Community Discussions on GitHub \* Issue Reporting \* Extension Source Code # What This Means for Wheels Developers The Wheels VS Code Extension turns your editor into a Wheels-aware assistant. You get: \* Faster scaffolding \* Smarter coding \* Built-in validation \* Better navigation \* Instant documentation This reduces context switching and keeps you focused on building features. # Conclusion The Wheels VS Code Extension isn’t just a convenience — it’s a serious productivity upgrade. Developers who use it will: \* Write code faster \* Make fewer mistakes \* Learn the framework more quickly \* Maintain cleaner projects \* Improve team consistency If Wheels helps you build fast, the VS Code extension helps you build smart. Build faster. Code smarter. Ship better — with Wheels. diff --git a/web/content/blog/posts/why-we-rebuilt-our-ci-pipeline-from-40-minutes-to-82-seconds.md b/web/content/blog/posts/why-we-rebuilt-our-ci-pipeline-from-40-minutes-to-82-seconds.md new file mode 100644 index 0000000000..ca00b998b1 --- /dev/null +++ b/web/content/blog/posts/why-we-rebuilt-our-ci-pipeline-from-40-minutes-to-82-seconds.md @@ -0,0 +1,17 @@ +--- +title: Why We Rebuilt Our CI Pipeline From 40 Minutes to 82 Seconds +slug: why-we-rebuilt-our-ci-pipeline-from-40-minutes-to-82-seconds +publishedAt: '2026-04-09T13:21:19.423Z' +updatedAt: '2026-04-09T13:21:19.459Z' +author: Peter Amiri +tags: [] +categories: [] +excerpt: >- + \ Why We Rebuilt Our CI Pipeline From 40 Minutes to 82 Seconds \April 9, 2026 + — Peter Amiri, Wheels Core Team\ --- For years, the Wheels CI pipeline ran + every commit through a gauntlet: five CFML e... +coverImage: null +legacyId: '1165378451752091649' +--- + +\# Why We Rebuilt Our CI Pipeline From 40 Minutes to 82 Seconds \*April 9, 2026 — Peter Amiri, Wheels Core Team\* --- For years, the Wheels CI pipeline ran every commit through a gauntlet: five CFML engines, seven databases, Docker Compose orchestrating it all. It was thorough. It was comprehensive. And it was killing our velocity. Today we shipped a fundamentally different approach. Our primary CI now runs in \*\*82 seconds\*\*. No Docker. No CommandBox. Just LuCLI, Lucee 7, and SQLite — the same tools a developer uses on their laptop. This post explains the reasoning behind the change, what we learned, and why we think this pattern applies to any framework project fighting its own CI. ## The Problem We Were Solving Our previous CI pipeline tested every push to \`develop\` against this matrix: | | MySQL | PostgreSQL | SQL Server | H2 | CockroachDB | Oracle | SQLite | |---|---|---|---|---|---|---|---| | \*\*Lucee 5\*\* | | | | | | | | | \*\*Lucee 6\*\* | | | | | | | | | \*\*Lucee 7\*\* | | | | | | | | | \*\*Adobe 2023\*\* | | | | | | | | | \*\*Adobe 2025\*\* | | | | | | | | | \*\*BoxLang\*\* | | | | | | | | That's up to 42 engine-database combinations. Each engine needed a Docker image built from \`ortussolutions/commandbox\`, which downloads CommandBox, installs Lucee or Adobe CF, warms up the server, installs dependencies, and then starts. The database containers needed their own startup time — Oracle alone takes 2-3 minutes to accept connections. A typical CI run took \*\*30-45 minutes\*\*. On a bad day with flaky Oracle connections or BoxLang compilation issues, it could take over an hour. More critically, this matrix had become a \*\*development tax\*\*. Every feature branch had to pass every engine. Every refactor had to work identically on Lucee, Adobe CF, and BoxLang. The cross-engine differences weren't just slowing CI — they were slowing the design of the framework itself. ## The Cost of Universal Compatibility When you maintain compatibility across three fundamentally different CFML engines, every abstraction carries hidden weight. Here are real examples from the weeks before this change: \*\*The \`invoke()\` BIF\*\*: Adobe ColdFusion requires positional arguments for \`invoke()\`. Lucee accepts named arguments. BoxLang requires extracting the method reference and calling it directly. A single line of code — "call this method on this object" — needed an engine adapter with three implementations. \*\*The \`interface\` keyword\*\*: We added a CFML \`interface\` file for documentation. It compiled fine on Lucee and Adobe. BoxLang's CFC scanner choked on it during directory traversal, crashing the entire application before a single test could run. \*\*Oracle TIMESTAMP coercion\*\*: Oracle's JDBC driver returns \`oracle.sql.TIMESTAMP\` objects instead of standard dates. BoxLang needed these coerced to CFML dates. Adobe CF didn't — until we added a unified adapter, which then broke Adobe's timestamp comparison tests. Fixing Adobe broke BoxLang's \`hasChanged()\` method. Each fix for one engine destabilized another. \*\*The \`$wheels\` lifecycle\*\*: During application startup, the framework stores configuration in \`application.$wheels\`, then copies it to \`application.wheels\` at the end of initialization. Code that runs mid-initialization needs to check both locations. This was invisible for years until the engine adapter PR introduced a function that was called during route loading — before the copy happened. Every engine crashed, but each with a different error message. These aren't exotic edge cases. They're the daily reality of cross-engine CFML development. Every one of them turned a 30-minute feature into a multi-day debugging session, with CI as the bottleneck for each iteration. ## The Strategic Decision: Pick a Primary Platform We made a deliberate choice: \*\*Lucee 7 and SQLite are the primary supported platform for Wheels going forward.\*\* This doesn't mean we're dropping support for other engines or databases. It means we're changing the relationship between primary and secondary platforms: - \*\*Primary (Lucee 7 + SQLite)\*\*: Hard CI gate. Every PR. Every merge. Must pass to ship. - \*\*Secondary (everything else)\*\*: Monitored weekly. Failures are tracked and addressed, but they don't block development. This mirrors how most successful open-source projects operate. Rails doesn't block releases on JRuby compatibility. Django doesn't require every commit to pass on MySQL, PostgreSQL, and SQLite simultaneously. They pick a reference platform, optimize the inner loop for it, and run broader compatibility checks on a separate cadence. ### Why Lucee 7 Lucee is where Wheels development happens. It's the engine the core team runs locally. It's the engine most Wheels applications deploy on. And with LuCLI — our new Lucee-native CLI — it's the engine we're investing in for the AI-native development experience (MCP tools, code generation, interactive REPL). Lucee 7 specifically because it's the current mainline release with active development and the best performance characteristics. ### Why SQLite SQLite eliminates external dependencies entirely. No Docker container to start. No connection pooling to configure. No 3-minute Oracle startup to wait for. The SQLite JDBC driver is a single JAR file. For a framework test suite that exercises ORM behavior, query building, migrations, and data validation, SQLite covers the vast majority of code paths. Database-specific behavior (stored procedures, vendor-specific SQL) is tested in the weekly compatibility matrix. ## The New Architecture ### Primary CI: LuCLI Native (82 seconds) \`\`\` checkout -> setup JDK 21 -> install LuCLI binary (38MB download) -> create SQLite test databases -> lucli server run (starts Lucee 7 natively on the runner) -> install SQLite JDBC into Lucee classpath -> run 2,482 tests via curl -> parse results, generate JUnit XML -> upload artifacts \`\`\` No Docker. No CommandBox. LuCLI downloads as a single Linux binary from GitHub Releases. It starts Lucee Express directly on the GitHub Actions runner JVM. The test suite runs against localhost. The total job time is \*\*82 seconds\*\*, including JDK setup, Lucee download (cached after first run), server startup, and running all 2,482 tests. ### Develop Pipeline: Fast Test Gates Release \`\`\` fast-test (82s) -> build snapshot (ForgeBox publish) -> sync docs (wheels.dev) \`\`\` The snapshot release to ForgeBox only happens if the fast test passes. This is the same gate that existed before — it just runs 30x faster. ### Compatibility Matrix: Weekly + Manual The full 5-engine x 7-database Docker Compose matrix now runs on a weekly schedule (Sunday 02:00 UTC) and via manual dispatch. It uses the exact same \`tests.yml\` workflow that was previously the primary CI. Nothing was deleted — it was relocated. This gives us: - \*\*Early drift detection\*\*: If Adobe CF 2025 breaks on a Wheels change, we'll know within a week. - \*\*No noise on every push\*\*: Developers don't see red badges for BoxLang compilation issues they can't fix. - \*\*On-demand deep testing\*\*: Before a release, anyone can trigger the full matrix manually. ## What LuCLI Means for CI LuCLI is more than a CommandBox replacement — it's a statement about where Wheels is headed. By using LuCLI in CI, the pipeline validates the same tool developers use locally: - \`lucli server start\` starts the same Lucee instance in CI and on your laptop - \`lucli server stop\` cleanly shuts it down - The \`lucee.json\` configuration file is the single source of truth for server config When CI and local development use the same tools, "works on my machine" and "works in CI" converge. There's one mental model, one set of troubleshooting steps, one path from code change to verification. ## The Datasource Pattern: Engine-Level to App-Level The move from CommandBox to LuCLI surfaced an important architectural shift in how datasources are configured. In the CommandBox/Docker world, datasources lived at the \*\*engine level\*\*. CommandBox supports CFConfig — a JSON file that injects datasource definitions directly into Lucee's server configuration before the application starts. Our Docker Compose files used \`CFConfig.json\` to define all seven database connections (MySQL, PostgreSQL, SQL Server, H2, CockroachDB, Oracle, SQLite) at the engine layer. The application never needed to know how those connections were established — it just referenced them by name. LuCLI doesn't support CFConfig. Rather than building a compatibility shim, we took this as an opportunity to move datasource definitions where they arguably belong: \*\*at the application level\*\*. CFML has supported \`this.datasources\` in \`Application.cfc\` for years, but the ecosystem's reliance on engine-level admin panels and CFConfig meant most developers never used it. In Wheels, \`config/app.cfm\` is the recommended place for Application-level configuration — it's included by \`Application.cfc\` and keeps the framework file clean: \`\`\`cfm // config/app.cfm if (server.system.environment.WHEELS_CI ?: "" == "true") { this.datasources\["wheelstestdb_sqlite"\] = { class: "org.sqlite.JDBC", connectionString: "jdbc:sqlite:#expandPath('../')#wheelstestdb.db" }; } \`\`\` This is a better pattern for several reasons. App-level datasources are version-controlled with your code. They're portable across engines without engine-specific admin tools. They're visible in code review. And they work identically whether you're running LuCLI locally, deploying to a server, or running in CI — no separate configuration layer to keep in sync. The \`WHEELS_CI\` environment variable gates the test datasources so they only activate in CI. Production applications define their real datasources in the same file, ungated, or read connection strings from environment variables. ## Lessons Learned ### 1. Comprehensive doesn't mean fast A 42-combination test matrix is comprehensive. It's also 42x slower than testing one combination. For the inner development loop — where a developer pushes a commit and wants to know if it works — comprehensive is the enemy of productive. ### 2. Engine differences are architectural, not incidental The differences between Lucee, Adobe CF, and BoxLang aren't bugs to be papered over. They're fundamental architectural differences in how these engines handle compilation, class loading, struct member functions, and Java interop. Treating them as incidental (just add an \`if\` statement) leads to an ever-growing thicket of conditional code. Treating them as architectural (pick a primary, adapt others) leads to cleaner abstractions. ### 3. CI time is developer time multiplied If your CI takes 40 minutes and your team pushes 10 times a day, that's nearly 7 hours of CI time daily. Even if developers context-switch during that time, the cognitive cost of interrupted flow is real. At 82 seconds, the feedback is practically synchronous — push, grab a coffee, see results. ### 4. The legacy matrix is still valuable — just not as a gate We didn't delete the compatibility matrix. We decoupled it from the critical path. The weekly run still catches drift. The manual trigger is available before releases. But it no longer holds every commit hostage to Oracle startup times and BoxLang compilation quirks. ## What's Next This CI change is part of a larger strategic shift toward Lucee 7 as the reference platform for Wheels: - \*\*LuCLI as the recommended CLI\*\*: Replacing CommandBox for Wheels-specific workflows (generation, testing, migration, MCP) - \*\*Engine adapters\*\*: The adapter pattern from the W-004 PR centralizes cross-engine behavior, making it easier to maintain secondary engine support without polluting the main codebase - \*\*Docker simplification\*\*: Local development moves to \`lucli server start\` instead of \`docker compose up\`. Docker stays for the compatibility matrix and production deployment The goal is a development experience where the distance between idea and verified code is measured in seconds, not minutes. --- \*The CI pipeline changes are in \[PR #2032\](https://github.com/wheels-dev/wheels/pull/2032). The compatibility matrix runs weekly and is available via manual dispatch at \[Actions > Wheels Compatibility Matrix\](https://github.com/wheels-dev/wheels/actions/workflows/compat-matrix.yml).\* diff --git a/web/content/blog/posts/why-we-rebuilt-our-ci-pipeline.md b/web/content/blog/posts/why-we-rebuilt-our-ci-pipeline.md new file mode 100644 index 0000000000..e7557d9afd --- /dev/null +++ b/web/content/blog/posts/why-we-rebuilt-our-ci-pipeline.md @@ -0,0 +1,18 @@ +--- +title: Why We Rebuilt Our CI Pipeline +slug: why-we-rebuilt-our-ci-pipeline +publishedAt: '2026-04-09T07:00:00.000Z' +updatedAt: '2026-04-09T13:23:39.918Z' +author: Peter Amiri +tags: + - ci +categories: [] +excerpt: >- + \ Why We Rebuilt Our CI Pipeline From 40 Minutes to 82 Seconds \April 9, 2026 + — Peter Amiri, Wheels Core Team\ --- For years, the Wheels CI pipeline ran + every commit through a gauntlet: five CFML e... +coverImage: null +legacyId: '1165378763664687105' +--- + +\# Why We Rebuilt Our CI Pipeline From 40 Minutes to 82 Seconds \*April 9, 2026 — Peter Amiri, Wheels Core Team\* --- For years, the Wheels CI pipeline ran every commit through a gauntlet: five CFML engines, seven databases, Docker Compose orchestrating it all. It was thorough. It was comprehensive. And it was killing our velocity. Today we shipped a fundamentally different approach. Our primary CI now runs in \*\*82 seconds\*\*. No Docker. No CommandBox. Just LuCLI, Lucee 7, and SQLite — the same tools a developer uses on their laptop. This post explains the reasoning behind the change, what we learned, and why we think this pattern applies to any framework project fighting its own CI. ## The Problem We Were Solving Our previous CI pipeline tested every push to \`develop\` against this matrix: | | MySQL | PostgreSQL | SQL Server | H2 | CockroachDB | Oracle | SQLite | |---|---|---|---|---|---|---|---| | \*\*Lucee 5\*\* | | | | | | | | | \*\*Lucee 6\*\* | | | | | | | | | \*\*Lucee 7\*\* | | | | | | | | | \*\*Adobe 2023\*\* | | | | | | | | | \*\*Adobe 2025\*\* | | | | | | | | | \*\*BoxLang\*\* | | | | | | | | That's up to 42 engine-database combinations. Each engine needed a Docker image built from \`ortussolutions/commandbox\`, which downloads CommandBox, installs Lucee or Adobe CF, warms up the server, installs dependencies, and then starts. The database containers needed their own startup time — Oracle alone takes 2-3 minutes to accept connections. A typical CI run took \*\*30-45 minutes\*\*. On a bad day with flaky Oracle connections or BoxLang compilation issues, it could take over an hour. More critically, this matrix had become a \*\*development tax\*\*. Every feature branch had to pass every engine. Every refactor had to work identically on Lucee, Adobe CF, and BoxLang. The cross-engine differences weren't just slowing CI — they were slowing the design of the framework itself. ## The Cost of Universal Compatibility When you maintain compatibility across three fundamentally different CFML engines, every abstraction carries hidden weight. Here are real examples from the weeks before this change: \*\*The \`invoke()\` BIF\*\*: Adobe ColdFusion requires positional arguments for \`invoke()\`. Lucee accepts named arguments. BoxLang requires extracting the method reference and calling it directly. A single line of code — "call this method on this object" — needed an engine adapter with three implementations. \*\*The \`interface\` keyword\*\*: We added a CFML \`interface\` file for documentation. It compiled fine on Lucee and Adobe. BoxLang's CFC scanner choked on it during directory traversal, crashing the entire application before a single test could run. \*\*Oracle TIMESTAMP coercion\*\*: Oracle's JDBC driver returns \`oracle.sql.TIMESTAMP\` objects instead of standard dates. BoxLang needed these coerced to CFML dates. Adobe CF didn't — until we added a unified adapter, which then broke Adobe's timestamp comparison tests. Fixing Adobe broke BoxLang's \`hasChanged()\` method. Each fix for one engine destabilized another. \*\*The \`$wheels\` lifecycle\*\*: During application startup, the framework stores configuration in \`application.$wheels\`, then copies it to \`application.wheels\` at the end of initialization. Code that runs mid-initialization needs to check both locations. This was invisible for years until the engine adapter PR introduced a function that was called during route loading — before the copy happened. Every engine crashed, but each with a different error message. These aren't exotic edge cases. They're the daily reality of cross-engine CFML development. Every one of them turned a 30-minute feature into a multi-day debugging session, with CI as the bottleneck for each iteration. ## The Strategic Decision: Pick a Primary Platform We made a deliberate choice: \*\*Lucee 7 and SQLite are the primary supported platform for Wheels going forward.\*\* This doesn't mean we're dropping support for other engines or databases. It means we're changing the relationship between primary and secondary platforms: - \*\*Primary (Lucee 7 + SQLite)\*\*: Hard CI gate. Every PR. Every merge. Must pass to ship. - \*\*Secondary (everything else)\*\*: Monitored weekly. Failures are tracked and addressed, but they don't block development. This mirrors how most successful open-source projects operate. Rails doesn't block releases on JRuby compatibility. Django doesn't require every commit to pass on MySQL, PostgreSQL, and SQLite simultaneously. They pick a reference platform, optimize the inner loop for it, and run broader compatibility checks on a separate cadence. ### Why Lucee 7 Lucee is where Wheels development happens. It's the engine the core team runs locally. It's the engine most Wheels applications deploy on. And with LuCLI — our new Lucee-native CLI — it's the engine we're investing in for the AI-native development experience (MCP tools, code generation, interactive REPL). Lucee 7 specifically because it's the current mainline release with active development and the best performance characteristics. ### Why SQLite SQLite eliminates external dependencies entirely. No Docker container to start. No connection pooling to configure. No 3-minute Oracle startup to wait for. The SQLite JDBC driver is a single JAR file. For a framework test suite that exercises ORM behavior, query building, migrations, and data validation, SQLite covers the vast majority of code paths. Database-specific behavior (stored procedures, vendor-specific SQL) is tested in the weekly compatibility matrix. ## The New Architecture ### Primary CI: LuCLI Native (82 seconds) \`\`\` checkout -> setup JDK 21 -> install LuCLI binary (38MB download) -> create SQLite test databases -> lucli server run (starts Lucee 7 natively on the runner) -> install SQLite JDBC into Lucee classpath -> run 2,482 tests via curl -> parse results, generate JUnit XML -> upload artifacts \`\`\` No Docker. No CommandBox. LuCLI downloads as a single Linux binary from GitHub Releases. It starts Lucee Express directly on the GitHub Actions runner JVM. The test suite runs against localhost. The total job time is \*\*82 seconds\*\*, including JDK setup, Lucee download (cached after first run), server startup, and running all 2,482 tests. ### Develop Pipeline: Fast Test Gates Release \`\`\` fast-test (82s) -> build snapshot (ForgeBox publish) -> sync docs (wheels.dev) \`\`\` The snapshot release to ForgeBox only happens if the fast test passes. This is the same gate that existed before — it just runs 30x faster. ### Compatibility Matrix: Weekly + Manual The full 5-engine x 7-database Docker Compose matrix now runs on a weekly schedule (Sunday 02:00 UTC) and via manual dispatch. It uses the exact same \`tests.yml\` workflow that was previously the primary CI. Nothing was deleted — it was relocated. This gives us: - \*\*Early drift detection\*\*: If Adobe CF 2025 breaks on a Wheels change, we'll know within a week. - \*\*No noise on every push\*\*: Developers don't see red badges for BoxLang compilation issues they can't fix. - \*\*On-demand deep testing\*\*: Before a release, anyone can trigger the full matrix manually. ## What LuCLI Means for CI LuCLI is more than a CommandBox replacement — it's a statement about where Wheels is headed. By using LuCLI in CI, the pipeline validates the same tool developers use locally: - \`lucli server start\` starts the same Lucee instance in CI and on your laptop - \`lucli server stop\` cleanly shuts it down - The \`lucee.json\` configuration file is the single source of truth for server config When CI and local development use the same tools, "works on my machine" and "works in CI" converge. There's one mental model, one set of troubleshooting steps, one path from code change to verification. ## The Datasource Pattern: Engine-Level to App-Level The move from CommandBox to LuCLI surfaced an important architectural shift in how datasources are configured. In the CommandBox/Docker world, datasources lived at the \*\*engine level\*\*. CommandBox supports CFConfig — a JSON file that injects datasource definitions directly into Lucee's server configuration before the application starts. Our Docker Compose files used \`CFConfig.json\` to define all seven database connections (MySQL, PostgreSQL, SQL Server, H2, CockroachDB, Oracle, SQLite) at the engine layer. The application never needed to know how those connections were established — it just referenced them by name. LuCLI doesn't support CFConfig. Rather than building a compatibility shim, we took this as an opportunity to move datasource definitions where they arguably belong: \*\*at the application level\*\*. CFML has supported \`this.datasources\` in \`Application.cfc\` for years, but the ecosystem's reliance on engine-level admin panels and CFConfig meant most developers never used it. In Wheels, \`config/app.cfm\` is the recommended place for Application-level configuration — it's included by \`Application.cfc\` and keeps the framework file clean: \`\`\`cfm // config/app.cfm if (server.system.environment.WHEELS_CI ?: "" == "true") { this.datasources\["wheelstestdb_sqlite"\] = { class: "org.sqlite.JDBC", connectionString: "jdbc:sqlite:#expandPath('../')#wheelstestdb.db" }; } \`\`\` This is a better pattern for several reasons. App-level datasources are version-controlled with your code. They're portable across engines without engine-specific admin tools. They're visible in code review. And they work identically whether you're running LuCLI locally, deploying to a server, or running in CI — no separate configuration layer to keep in sync. The \`WHEELS_CI\` environment variable gates the test datasources so they only activate in CI. Production applications define their real datasources in the same file, ungated, or read connection strings from environment variables. ## Lessons Learned ### 1. Comprehensive doesn't mean fast A 42-combination test matrix is comprehensive. It's also 42x slower than testing one combination. For the inner development loop — where a developer pushes a commit and wants to know if it works — comprehensive is the enemy of productive. ### 2. Engine differences are architectural, not incidental The differences between Lucee, Adobe CF, and BoxLang aren't bugs to be papered over. They're fundamental architectural differences in how these engines handle compilation, class loading, struct member functions, and Java interop. Treating them as incidental (just add an \`if\` statement) leads to an ever-growing thicket of conditional code. Treating them as architectural (pick a primary, adapt others) leads to cleaner abstractions. ### 3. CI time is developer time multiplied If your CI takes 40 minutes and your team pushes 10 times a day, that's nearly 7 hours of CI time daily. Even if developers context-switch during that time, the cognitive cost of interrupted flow is real. At 82 seconds, the feedback is practically synchronous — push, grab a coffee, see results. ### 4. The legacy matrix is still valuable — just not as a gate We didn't delete the compatibility matrix. We decoupled it from the critical path. The weekly run still catches drift. The manual trigger is available before releases. But it no longer holds every commit hostage to Oracle startup times and BoxLang compilation quirks. ## What's Next This CI change is part of a larger strategic shift toward Lucee 7 as the reference platform for Wheels: - \*\*LuCLI as the recommended CLI\*\*: Replacing CommandBox for Wheels-specific workflows (generation, testing, migration, MCP) - \*\*Engine adapters\*\*: The adapter pattern from the W-004 PR centralizes cross-engine behavior, making it easier to maintain secondary engine support without polluting the main codebase - \*\*Docker simplification\*\*: Local development moves to \`lucli server start\` instead of \`docker compose up\`. Docker stays for the compatibility matrix and production deployment The goal is a development experience where the distance between idea and verified code is measured in seconds, not minutes. --- \*The CI pipeline changes are in \[PR #2032\](https://github.com/wheels-dev/wheels/pull/2032). The compatibility matrix runs weekly and is available via manual dispatch at \[Actions > Wheels Compatibility Matrix\](https://github.com/wheels-dev/wheels/actions/workflows/compat-matrix.yml).\* diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index cb8f532134..55c2b26cc9 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -48,6 +48,12 @@ importers: sites/blog: dependencies: + '@astrojs/rss': + specifier: ^4.0.18 + version: 4.0.18 + '@astrojs/sitemap': + specifier: ^3.7.2 + version: 3.7.2 '@wheels-dev/ui': specifier: workspace:* version: link:../../packages/ui @@ -139,6 +145,9 @@ packages: resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@astrojs/rss@4.0.18': + resolution: {integrity: sha512-wc5DwKlbTEdgVAWnHy8krFTeQ42t1v/DJqeq5HtulYK3FYHE4krtRGjoyhS3eXXgfdV6Raoz2RU3wrMTFAitRg==} + '@astrojs/sitemap@3.7.2': resolution: {integrity: sha512-PqkzkcZTb5ICiyIR8VoKbIAP/laNRXi5tw616N1Ckk+40oNB8Can1AzVV56lrbC5GKSZFCyJYUVYqVivMisvpA==} @@ -779,6 +788,9 @@ packages: '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + '@nodable/entities@2.1.0': + resolution: {integrity: sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==} + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} @@ -1395,6 +1407,13 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-xml-builder@1.1.5: + resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==} + + fast-xml-parser@5.7.0: + resolution: {integrity: sha512-MTcrUoRQ1GSQ9iG3QJzBGquYYYeA7piZaJoIWbPFGbRn6Jj6z7xgoAyi4DrZX4y2ZIQQBF59gc/zmvvejjgoFQ==} + hasBin: true + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1846,6 +1865,10 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-expression-matcher@1.5.0: + resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} + engines: {node: '>=14.0.0'} + piccolore@0.1.3: resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} @@ -2076,6 +2099,9 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} + strnum@2.2.3: + resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} + style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -2569,6 +2595,12 @@ snapshots: dependencies: prismjs: 1.30.0 + '@astrojs/rss@4.0.18': + dependencies: + fast-xml-parser: 5.7.0 + piccolore: 0.1.3 + zod: 4.3.6 + '@astrojs/sitemap@3.7.2': dependencies: sitemap: 9.0.1 @@ -3058,6 +3090,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@nodable/entities@2.1.0': {} + '@oslojs/encoding@1.1.0': {} '@pagefind/darwin-arm64@1.5.2': @@ -3758,6 +3792,17 @@ snapshots: fast-uri@3.1.0: {} + fast-xml-builder@1.1.5: + dependencies: + path-expression-matcher: 1.5.0 + + fast-xml-parser@5.7.0: + dependencies: + '@nodable/entities': 2.1.0 + fast-xml-builder: 1.1.5 + path-expression-matcher: 1.5.0 + strnum: 2.2.3 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -4610,6 +4655,8 @@ snapshots: path-browserify@1.0.1: {} + path-expression-matcher@1.5.0: {} + piccolore@0.1.3: {} picocolors@1.1.1: {} @@ -4986,6 +5033,8 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strnum@2.2.3: {} + style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 diff --git a/web/sites/api/src/content.config.ts b/web/sites/api/src/content.config.ts index 86659b358e..0a8a8adbe0 100644 --- a/web/sites/api/src/content.config.ts +++ b/web/sites/api/src/content.config.ts @@ -3,8 +3,8 @@ import { docsSchema } from '@astrojs/starlight/schema'; import { glob } from 'astro/loaders'; export const collections = { - docs: defineCollection({ - loader: glob({ base: './src/content/docs', pattern: '**/[^_]*.{md,mdx}' }), - schema: docsSchema(), - }), + docs: defineCollection({ + loader: glob({ base: './src/content/docs', pattern: '**/[^_]*.{md,mdx}' }), + schema: docsSchema(), + }), }; diff --git a/web/sites/blog/astro.config.mjs b/web/sites/blog/astro.config.mjs index 3e77f1ee14..29df87c4c9 100644 --- a/web/sites/blog/astro.config.mjs +++ b/web/sites/blog/astro.config.mjs @@ -1,5 +1,7 @@ import { defineConfig } from 'astro/config'; +import sitemap from '@astrojs/sitemap'; export default defineConfig({ site: 'https://blog.wheels.dev', + integrations: [sitemap()], }); diff --git a/web/sites/blog/package.json b/web/sites/blog/package.json index 265bc12479..c9cc614d9b 100644 --- a/web/sites/blog/package.json +++ b/web/sites/blog/package.json @@ -10,8 +10,10 @@ "check": "astro check" }, "dependencies": { - "astro": "^5.1.0", - "@wheels-dev/ui": "workspace:*" + "@astrojs/rss": "^4.0.18", + "@astrojs/sitemap": "^3.7.2", + "@wheels-dev/ui": "workspace:*", + "astro": "^5.1.0" }, "devDependencies": { "@astrojs/check": "^0.9.4", diff --git a/web/sites/blog/public/blog-images/.gitkeep b/web/sites/blog/public/blog-images/.gitkeep new file mode 100644 index 0000000000..ca4f52f94c --- /dev/null +++ b/web/sites/blog/public/blog-images/.gitkeep @@ -0,0 +1,6 @@ +# Intentionally empty. +# +# Historical blog posts reference images at cfwheels.org/* URLs that now +# 301-redirect to wheels.dev/. Image recovery from the Wayback Machine +# is a follow-up after Phase 1 launch. Recovered images will be dropped +# into this directory and the markdown references updated via a script. diff --git a/web/sites/blog/src/components/Giscus.astro b/web/sites/blog/src/components/Giscus.astro new file mode 100644 index 0000000000..f4558b938e --- /dev/null +++ b/web/sites/blog/src/components/Giscus.astro @@ -0,0 +1,37 @@ +--- +// Giscus config for https://giscus.app — backed by GitHub Discussions +// on wheels-dev/wheels repo, category 'Blog Comments'. +--- + +
+

Comments

+ +
+ + diff --git a/web/sites/blog/src/components/NewsletterSignup.astro b/web/sites/blog/src/components/NewsletterSignup.astro new file mode 100644 index 0000000000..5a9abec599 --- /dev/null +++ b/web/sites/blog/src/components/NewsletterSignup.astro @@ -0,0 +1,74 @@ +--- +// Buttondown embed for wheels blog newsletter. +const username = 'wheelsdev'; +const action = `https://buttondown.com/api/emails/embed-subscribe/${username}`; +--- + + + + diff --git a/web/sites/blog/src/components/PostCard.astro b/web/sites/blog/src/components/PostCard.astro new file mode 100644 index 0000000000..9bd7d19eac --- /dev/null +++ b/web/sites/blog/src/components/PostCard.astro @@ -0,0 +1,81 @@ +--- +import { formatDate } from '../utils/posts.ts'; +import type { Post } from '../utils/posts.ts'; + +interface Props { + post: Post; +} +const { post } = Astro.props; +const { data } = post; +--- + +
+

+ {data.title} +

+

+ {data.author} + + +

+ {data.excerpt &&

{data.excerpt}

} + { + data.tags.length > 0 && ( +
    + {data.tags.slice(0, 4).map((t) => ( +
  • + #{t} +
  • + ))} +
+ ) + } +
+ + diff --git a/web/sites/blog/src/content.config.ts b/web/sites/blog/src/content.config.ts new file mode 100644 index 0000000000..9a96921abd --- /dev/null +++ b/web/sites/blog/src/content.config.ts @@ -0,0 +1,23 @@ +import { defineCollection, z } from 'astro:content'; +import { glob } from 'astro/loaders'; + +const posts = defineCollection({ + loader: glob({ + base: '../../content/blog/posts', + pattern: '**/[^_]*.md', + }), + schema: z.object({ + title: z.string(), + slug: z.string(), + publishedAt: z.coerce.date(), + updatedAt: z.coerce.date().nullable().optional(), + author: z.string(), + tags: z.array(z.string()).default([]), + categories: z.array(z.string()).default([]), + excerpt: z.string().default(''), + coverImage: z.string().nullable().optional(), + legacyId: z.string().optional(), + }), +}); + +export const collections = { posts }; diff --git a/web/sites/blog/src/layouts/BaseLayout.astro b/web/sites/blog/src/layouts/BaseLayout.astro index a2dca80b2d..ac89b50060 100644 --- a/web/sites/blog/src/layouts/BaseLayout.astro +++ b/web/sites/blog/src/layouts/BaseLayout.astro @@ -1,6 +1,7 @@ --- import Header from '@wheels-dev/ui/components/Header.astro'; import Footer from '@wheels-dev/ui/components/Footer.astro'; +import NewsletterSignup from '../components/NewsletterSignup.astro'; import '@wheels-dev/ui/styles/tokens.css'; interface Props { @@ -23,6 +24,7 @@ const { title, description = 'News, tutorials, and release announcements for Whe
+