diff --git a/CHANGELOG.md b/CHANGELOG.md index 90303ca..3670c35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `json` tags to Tag and Technology. could be useful to serialize to _JSON_ (and not YAML) the tags and or techs repository files, without having weird keys in the resulting JSON - errors when encountering duplicate block IDs, empty blocks and other edge cases in descriptions - support for `null` values in layouts. this gets rendered as a special layout cell "ghost" (see `ortfodb.EmptyLayoutCell` for the value). This is useful to add empty spaces in a grid of images, for example +- lsp subcommand for LSP support ### Changed diff --git a/cmd/lsp.go b/cmd/lsp.go new file mode 100644 index 0000000..4589bab --- /dev/null +++ b/cmd/lsp.go @@ -0,0 +1,24 @@ +package main + +import ( + "os" + "path/filepath" + + "github.com/ortfo/languageserver" + "github.com/spf13/cobra" + "go.uber.org/zap" +) + +var lspCmd = &cobra.Command{ + Use: "lsp", + Short: "Start a Language Server Protocol server for ortfo", + Run: func(cmd *cobra.Command, args []string) { + logger, _ := zap.NewProductionConfig().Build() + languageserver.StartServer(logger, flags.Config, filepath.Join(os.Getenv("HOME"), "/.local/share/ortfo/lsp/logs/")) + }, +} + +func init() { + lspCmd.PersistentFlags().Bool("stdio", false, "Used for compatibility with VSCode. Ignored (the server is always started in stdio mode)") + rootCmd.AddCommand(lspCmd) +} diff --git a/docs/changelog.md b/docs/changelog.md index 90303ca..3670c35 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `json` tags to Tag and Technology. could be useful to serialize to _JSON_ (and not YAML) the tags and or techs repository files, without having weird keys in the resulting JSON - errors when encountering duplicate block IDs, empty blocks and other edge cases in descriptions - support for `null` values in layouts. this gets rendered as a special layout cell "ghost" (see `ortfodb.EmptyLayoutCell` for the value). This is useful to add empty spaces in a grid of images, for example +- lsp subcommand for LSP support ### Changed diff --git a/docs/lsp-support.md b/docs/lsp-support.md new file mode 100644 index 0000000..0e55e3c --- /dev/null +++ b/docs/lsp-support.md @@ -0,0 +1,41 @@ +# Language server protocol support + +The language server protocol (LSP) is a protocol used between an editor or IDE and a language server to provide language features like auto complete, go to definition, find references, etc. + +ortfo provides a LSP server that can be used with any editor that supports the LSP. + +It allows quality-of-life features like go-to-definition/hover for tags and technologies in description.md files: + + +![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAa0AAAEmCAIAAABeQ1h7AAAgAElEQVR4nOxdd3xVxfKfvekkNyGdQICE3pEmCCqgIIoU67M8GzZU7AV79+l7T9GfAipPsVfEjj7lWRCQ3gKhlwRIgYT0fpN79/fHOWfPbDv3JiSAwOgnnLtnd3Z2duY7s3saSU7qRQEIAAWJqFkYEpl8a1rQr1vzNvvkSlKjkMhzUpNPiQwJpt4DpQe+y6045L8RWP2bghgi4ROATzeSCLjaxrY5v407Pgjq6qrW5ub/Ue0lUjWmB/lUsxMFSsx+OPUzLUCTRhowBbU/q+tpPcK9lRU7l2RvzPI2D9ekxNETU5JDvCV78lf8WlzmBUAq5YcT1PWi3p3yt/+8vI5XvDzbBIDEntLhtEEx0RFQX1a5bdHezfsbmkfgk3SSAACAJCf1io5upwFBSgCoFiTVROUzyMIdfVsEAVaZ8KcFJrIPERWgCIWWXBzkUgCCGxECFPWm61vPXTdghIOsX3z22CMBtGV1q8oJIP0pm4CsKArEUga1jtVcTpIjKV0CAlChQxwOVP1UbxZN5NhyVFlxwAUOAhKizxSdCTk1Nf9S8YRDK4qLhEmhfDmo8jgMTRRVJqjQ6o+TSBSPuZ/SMgQQlMXX55aEdW4gMSFAiJALHSskiGJNqKlN5Vk+lNh6d+DGNQCglANBhozkKPvMX4koP0GyLzk0VNpiI5ZLRPoLyGKIyluOJrlAZcyMrLQlUK+08ilLW1TkHhiAmn8J36+AZcBrVF5TAS83Dofq8RBkKbbjWQNxENlfpBVAnMEfUKAUJ4YmEuAhHEMk5OdCIeULUUpnhyNWjfLV2IgJ0pGYjDOLIuYxOeY0dAwR0zZLE6g/9yOqn7KOmwhcMvDJjkj0vbYsuYx/FChPjCUxoSr96aCE2J5MBdPHQSEAwk5DQKUe3cyqkj5/YQxXMnpjS1VdBzphAYVN64AbuyWcBfYECFBKecUdG1ESELLLCS9FByCphVpaZHwcuhDIZiuEUGtGZHw8CYmYlNmYc30hnIM0yyB5kZzbNUI4JUdlUG1pIsBw0KkWUatTLylVeb992PghqlvIubU8R/inlohS/zjLVLXG5/HqWC84XvwJzQ0lE3HVd1SdWwdPOC13bihkiGL2h8pl/aPU3AJU1D3eNDT/+h/QCUFY+RTZpLMpOdqtyJaV6PBRbqUlASMckqWmIG4AZA7DpeuWlVLaWBNj61m2NLJH0XhzVaNw4PoLiD1mJKYwErxR3nvZBAkwwf5arYnABKnHULJxYYpYkYddcTrScIiHI0+YQ7ku+8MqUkYnuVDETWMtTJEvSIbR2GXyXyWFxFpyDj/K5F2HUILOqaqC0KN8QFU9AjobEDmHXKEnJUQ2gTiLtNfFCn5mVqfWvW5GiOXP1tKIs2xZt/5kBdUsNQfxIOXow1YR25lS1hTI2bCI7erE/AOEEBMTiUl+hG85Upo1mw2imRMMYXIJRaMWenFgBaghwYGUiruEjQ3YuiymhahpCY0QPGQ0wKcwUelYEIBKJYJ4ONhTng8WD8sJUoVGkIz3VCOTEAJxiXPfgtZszdr5IJWt0ZGnor7djq3vKHedAcnfGJttGYNV4hTwysd6Mbbt7SvIRGEosjUISM7+ovrUWvxZjAm1CHQjb9FlIOUHApaogFQkWyNIY1dyBt4acS8yK8HJzaSZmpjIseK7FK+x8b04QPnhk/PYHVoJTkokDcvZtPM0YXuWs3jcVohMRDW/2EGoJAymwLUqm5DiNOXnTB4GQYOUTymtSkR0Lh8UyapMiKKKP+yVYj0/GfK866nForaQdMhYxoViKjkbb6yy1QqkWUEQdJYAASsdNH8e+VtFiPQTOwAjO03Tj93BLImjL8lOTqx/iHWCi0M8L4puYxWwQw5dgZMfv9UMSo6pMmFpsfaoqhXRlAt8ZJmxeBg6hMqCMHIF5XBktcjqUtqJH/vW8QV+JKxEiUyCl4rkb3/QVLfWYPVmzKsfi4GONddgGCmjmHPPGimdJ0kOfaKTIBaE3dJBTOkEe3WIloKdqZyXGv+Znm46tD69aSYSoqaAd0xUYR6VA5GViWFUNnrBdOWwJBBOBhk4mv+ijQvCfhKuLUiSB06aSGYLo+RGpVOCI4CqrZyRYQFkwjFJ1rMDPgYyFiVDHXo6sMXCONcR5XbgJStI7kyoIErs/3oxAPiFK3UjswGvUSnWOQKbYCn4pwZpdDLK1QVPkydJloJ5IHdnr0pAwrPCICJJa4pm3xUnJoDGJq3TduHhk05CoY6A9SA1IagCoAOC/gdepTJD/D+VlCkwJ5b6WJJoYB/LE6n+blD7VkTJq3UkWJ88EI6/CiNA0qSyazZ2Qc/KMCPPgtCREhZ02ZzgF0SvH8JLKNRUQjkmAbUUlf0ipSyNPAysSt5ArRYB4CB3N2ugcC3JilADFyBUCYyVbBToWGk0SkUprQckr8MNAZ0ylmaUcoyUmY6OFerRdFvDYTkxrV+mlnRJZmCkayr4DEhakocAmrM6/3HOYgDBGdFwA3RWORAC4o6hog4x/zL4YyhJQVC5OEwZRwSfkuEJpFM6wFKmyYDGiw1bCV5ykJA71QV4UJkoVUmF59EvH6oanYzC2ABkCzwskkVEf9lCgQL4x0HbNqjdSN+bQGikUkqIzIg9OGAbs+CHdjf4tzxL6OK24KIS+ijkAbk7FZk9888HY2sTDEiGEsm17JQFDcvcITRusqaUEHnIAZOsTyyYrBwdcsljEcblkCTKGMd6F7BS59V4IDjNkaUlllXhp1DAAj58vYuT05oYYYA6rcturwMObBvC7AsAijWjhCedAIB0JStTWU4l9QrdKS1OtnOllxG+XBdgcEc6D/JLMnO/xIcuGwe1TEx4IQypBAEcBEaaJFwpiCqwa+LbIXQoZrYVMYNtsHHjZKOQOQiRU1lTNzD2D6V2bAFZQ1J3oDBBAubA2XagHbREmRoTK/GglEYvQyGR/uKf2I2ppGSQ1KhDCjneYHtQIqA8gw44LktDqb2la1uYNYPsLzsQbpZySIJAJQnlRwT87LNWDjCE68g2KcQPJUPZsGXXk1WHwVSINMIxnjt5dMpyYewC5FHEtjFmrg3bOsKACwBCPqjulwAo3iHTCCJmn5LiqahTUzxq2i1DB05ZnGOoAgHOePEuHi+QxEphcAFNBFE9Piabl2A3ghtbx4TnR+1rx/ytc35FU0cOCQ2xOwnuin/KrgvScECqqayj8xnlELCrOKOJAOUcHBD+NhrriFJOS8LOL95VtOcDjUWYBEE8AM6odOggD0oAKWX8ljFCNmksRqPSK2FQgQQA5QGVJksAYmUvOI8JRFTnEKL7KTF36U+hEwZI8TcRC8I4+6V03Q5JhodtdWQeEm5xYzfhOFALpwkqsc6qHnBV+C8yL/w0jGC9aqIMutBFZL8jxad0+EttTBSl94vQguUJMAG8jSqUpBq8zqx1AiizGOAlcXZRGT2dLIHXsJhuoCdSuIEQPuMjqDJwWaFyaASVCLIp0UoGULk+ESTXDFzGXFk8nH442QwR/uWk0mQJ/sMYaPqlKuGxZgSj1U26X3yX7VnjPty6WM2T2YNmUwX34kyKVzYQ1VD54IB3t1UeaKAXhjQTOwngRzIosRMDVKoRVVYXtnzOJzi0xVUlZQtMcaajNBqCUhb2ei5hEedg3YIxORiNAHOA9AzSKWHKlHWUcsmSUGnIOvGoqjvZnWRfwvxZRCWAkkTKpXsUjZy7Zx71JGSX3DHhJJHFUE6BrEMBj+SAIdSU8YtK5WrSiOUMwX6DMe6dHSubC+Wyg4txSyOSUgalTRJeJAoAEKxnI46HigKKXfiFQuvtNdrT3AEVmXK73sDgzpLNvPBHiZW4sjvvrDe4mD9xJxiUdLMgEG8hhALCVaNbIleUWLA5UA6WmOKyYeJmllcKWMWJxR3rbJp1KqOMLJsDKStQvgsicRNaCSimI7kOBj7Z7rmxE26A0pENfyz2crcyEDssU2vSWbpuzgba5cUVQDVRzvmOYJpE00RJirPY+2VAlaxEvnnfP6SqpJUbCiAoYByOlEqDoVJlgTnlVSfwBB55LfK3P4jaWJE0wKnQEn9TtVM9wT9ZPigsz82rtcYumoWA1EoAWY9oyavwNiL9VRKbZb1Z+huXPEaZC0WADcwrzT7lB1vMSizZobx5CRJRsSPzwAEEBadQIrwzQgnVdM11JHNQGhGRxCC8DMrJsbsmpplQdE64mwlfa8ZXVLirdsxGLZRkzfENjIJXO5AMXH6baFnIUZFIViLol/AKdSQlBslSyCLIdijXlx1XWQGnM9gdhCGivlwCEy3ZM66dvUAAAAET9T+ZSpPFv4j9V+iFe72++TZZrA8ZHgIiObQA6oYHtsagIT5GAGRDk+E+5hu6qImF3KaVpEwHQxR0rzRyAaApcOaFQRNrWjcuuVx51q/O8KCIVA5IZoEtVf2kvC1gGLU7InZyB2xzxbI8gjeFrUnC7Qkvqw2dxC5m9+voBivDuj3kQMxMiAZyN0QyF6xQKlV2JAcPYIYkT4c8s1Q6C3w1IeABGoeSLeVLkIQBXC9Gp61bRDRXTBB/R6LAAWIA1Gi8EloKQQf4iW8KGgrN0DEhopmD2IXglnrBcZKBNwaJkbPg2w7xIs7eBdPELEGuAPM4WU9KMOUZNkK5AVaVVafEOAfmcuYrwKjsYGpJLFBjSSLhgY8qY5GVVNqhRcAGNqey9EytrCMZmHRTJaCpADkC9iitG7eS4ZlwLXQWrsF8NbSxuRD8GHh5ZRLGIYc6cMwHFZOO8gIz+OlmVxqU/mTjobDZSE7mDpcE07CULERRVRtBInyWdw1+LUzs/UHbgan4F4g938JYKZJViXryTyXpmkhBoDl1rXQhTVBSkJCqEI3d6/JHjo8FdvgmbbsCf18O7tX2ST7ZVAuqAxWH1FdOrvBky4MR0EK2SIrKcXPClyt3YDWy47+CAqgkBZXGIQsI/LjlwcmyWQdiPqjQNz8R5tKYYtGaQFwIPrJA6BCMmrkjHg0cKvIWgIjif8THZIn5hAlBrqxcKQv3LJm/CGdkwGOiKAE6VvqsfmSqYR1VUqKNfFaXbsihBd+VjfVPpHkVFsWUVcPwJEdIjNySQBQXYiZEP3nCCIWYAHxNLB7hWwloZOlBv1gUOxcHouoNq1A2UYdILAOfsjIBUD5Xpx6ExRdduwTFrDSCxGkITH/NTji4BJ5UOBGR/jrxlIMV2Eag3VzSkbE5JV9IAuCWbNg+sH8pOTd1qimvXExHY6J5UjoVSHpQHugSAEUhb1oYIyieSDbNylxMBiwdCQkdUQ0AY65GTnGQDmADUuim/HrRUWYB9YRxsGNlE4fBCZJihFXyVF4nURu8K3HGOafd15pbnTUHcJnKMuKjMHVHhJQadTD2gIhXeABZEdHbhCrbMJyIZw72tLNEQxmc2doZ+4vNybpgql9ENI2OPvZhIo6mppuoRo9B1wfL4nV9YGR05GlfYxHAQOBPJc6gOpDTXZBqyq0Id4YA6l02I9VPWXZl59g7VXmDH7TXA3jA+SDq0vIs6pyfBBAOhOriQvKIAyKolhhN54UOSED6EKpImYG9+4SDLpWmQOzEijLczcC6nIAljwDAXuFj/Tzs2HCk0VCXkbKzAgVitc0wBtwNDpqyrDIwOUCVshf52KFmEzIAHd4okQn4n8JtHTwbyutGNxoiKRJU86jL8gx7T07qFR3dTirnqHvnIe91c7MzdfmZ52worKOQ3rbHk92Tu4dBZU3ZT1u3zCioA4C2SV0e7p7SNzIEGqoO+SIhf82VW8tDYzo81af9YHdoKDTkFeXO3LhnUR0AAAT16PbM810jF6184LVD9XjEVCfMESEhMWu6FBYjITwFALLypKKbc7kqHCCCfSuvnT1avIhkiBQlJjZQKS3bQeDDihktTkcHgJudhNUds0wBuQRrOMLigdSpIBsBzhd42wP+vHKsIA1amF/ddMvVLCaV5fni8yRKc87at+nmQ4k3n5panJk5v8IHDTUeChCafEfveM/eHS9U+OITO17Xu9Pawq2LIHZq79T4wq0Pb6r2BEdd0qtnVwCA4HFdO3Wv3fPk5uIiiBjVo9uVKXmLsmtN7r568NZ7Rek4pSrDdkt6njJcN5ERypkJ2KvWwEQQyoRXOliszTSO4JZWDohbii8RwIjJHry1rANDpMIJdXZ/7NExL2BgJK0x7GNlpnSEh63rDkOXIC1CO2EEOOWlEifgK+iitoCVcjKKyN9zdQAA4Kmv3VRR6wEor67YVGlyIbTyu81b9uaXZFGA0tBRKUnp4WQRuDuGVi7cfXB5DQBUxZd36QYEIDg+BIoOFCwvra2Dyk1ritwNPpO1d9uOxy/bIWpNwHZFPGi2hK3lCSdzVkHj5cUrWgZxgsXw1ezsUbt9wVsfhlg7qcSVdSD4F5qNE4qOcEro0KNz4BTyOhUsElUL3Ih1jiFEyCjl5taBjYON0JnBvcGbkNDp/t5R8cEuAABavowAEBeA19Ng16VAAWoX7j80qdewBakV2ysrthfkfZJbGXBPTDpFpHPOi2Wvde5GU02II00k44lNolgj+yM8u8YawnqWhFpLCu5JVmwBZlvhpT3AZYXsrFxBvKWD8ZVRT8BjP4B4Ei+PCB35TNihR2HOsZnivyrvcABBZSosVA7AzmwclE2eZ8d3QiA0Pm1qsve7DWsX1fogrM39g2KBUmio80CwOxSgHgAgzBVkNMvOybyoIHJ4fHSau/Wo7oOHR6y+YleVf+lMkjcMFOeARwzQZMTAs5AnRzl8VN6kbA71Zb3kBPyqnGsGLA0HCtxFErM9AkEC3BUVEwoxCcCHH4ZVGJ2AbkqrxP0JB4rBUPtJx5N0QpGMYbpUMYBMxgF1G7k4CUam6djK5/X4IBRdXnZHhIZWlSwsrNwOAD6vKVd95fbayFEd4uZvK/ZEth3V2gU1BABCw8ITPFWL8qsgP38tjZ7ZOsoNVZWNTooU1R0cFDSFeCpoI9taxU13YB5zGxOxMY6iQlM1Fq4IZ7l5tU1LhkVAhqNcighc7DoWVy5xZu+0YgeIA5OOSBVO0glCykROmS0i33datPLWq0uCFIsbAIDggFISAKC1WbVh49omDmpoGNStS/qBTU/WejyRCRPblIRWQ3pqUporOC82PD6v4tMdB4f3PWVBGgCtr/RCOQBA+HUDh4wq2z5jf5UnJGpCYkRlucdjsA3q0e2ppzu1WrTyoTdK6p1HCLwHHi4JKnLY4pKi0mHJwPhbE9t44t/qZC+QiQUn+J0puuyNs0PZKJVmSpR1KKc2u6FR7mC6+H1oJ+kkSS5I+KyQNy6tpyJXtt8epswI2DEJlnjpqOrLHTnD+/Se1R4qKg7MLK711GbPOdj7un6DLg6CyuqSZQfo4D7dRhdunJ+/9eKCXekRoeDxDOo34qKGBg/Ufrp9f98+3Wd1DAGvJ7ck57XdJR5TBOIKCQkNDQ1qhLKax20CcXTg9y0kID4cNGRT1Hgm7KYr1M6ERWItipWrW9CsfZtKLBNEdiePxTZoq4IhI1UxYwnmSXA8MUl2QeCzFKXrCT/lRbdsTvzCKTmplxvdP9hEz8aOFxJ7c6eo7AMlh8ITp/ZpV5T558MHfYEwdV7RV5QX1NRWUJ9ymafeYABec81KAbEURyQEJy6RR3jCQ5XDO8BbnHTz4WyESlvl6uAPDuBr09JfkOxf5iYIKa+xdK0cFKtcqFHHctlV5V5kXwaNdys176BYvzMCqhJMfL8ulys8PModkyTVO8KkVDooXQidwvXlmsJZqCzPC7aayhlGY8heo1HqIlExqY+kdQn1eXbkbf+PAYIBo5Fy6ivKCzye2qjIBJfL4UYfyo9ZKHRqI3QttG+M1P7H2RgNO4UG57Bx/JJfvFE6vV8sP0kc+XwN1dVlUFZwtKFQuWwD3nHxLg3VWAhblAjHJgfzeZLmzZsoAPdlDZzjNB4GKEBhwZ5WrWKDgkL9dqtKD4SlYCMkkOOIpnGgoNR48PKvuBbLeY9ZkrMp4I+FWAiSehzyNF3id8KRz9dQVVWUmNTpaAuCSTmzOnyUCwUoMKmyPN+8AMy2q2QeTSACxkfHgYD8vbVG8TH/+nw+fyAIPMbLvgFWrGi0ADimOFZUHvippycaSM/Uj2DHH1H+mCAdYO3Kcy2c1XHGOlc61YlCLlewz+vzX++IkjwdxF8F4KdePaEuak44Bb2BJKf0DFhQRuaWPTE/m2SsnBG2tbiBEdSNUlmNkEC53+JYXUuy1+qZEElT2kYnjL86TCvl4U+OhURyCaVudYipDLTHNZ0YowT2vhlrvM01bmyplCsGR7/WA1RzSCZsEASaRQlCsYWTSiT/C1+sl8CyQty5yNY5/B3XJOCdgHQORqbME5VASTUMTxg6YRYaLv6zwM07bvPzhZRSir5eSKwDfTt1cTNZImkECmlagnaNrVyR+eEZ8Hn1sVx6Yliv3yWSQ0OmJ+edB3mhrbzecvzScT04TC7Hj7MfJhH27AOxvqnO7u9Vv7RQXtMIHPkALS5sApo24cpDU6I94f/Xn/TPOWDlE147VD4nAKKcxp4knpzXuQ4zgysf13uIJ0ZEBSMfbOEuTLih1reFCBA786QSnAS2KLaRgAAB+2HZxgzGSgq0bwb2T465n5+dwEYmpVhTVEI5ERrly8zHtb+2BMmbg5iYgk/gVfNxRC72gKdFzT6jxLx2jHCKJYr4A5PistOfOOLXHSjXzkEe7lj9qbBA2wdW0WmvMODL9MIcYZC19QfSqk+ftx5NOtbk0ZCQ9wmFeBNCd/YvTsfFIAIhF5h3zDAnarlUWMQF694aDRYwX+nUTTwtZEXAXflozNwFip06CsCf/eNswImhcjOLS0kpr0zClx9Tq5xjSpgASHAQ5b6K7D4ns8W/Brl4H2lR4+SusmqXHDpocVj1oas8JJAPqOLVJG0GfNCjof+4IiB5YHUBORjLSgjwkhAeFo8pXwwg3T8GyQHUnC+z/NUwn9FfVvDGUjC/HIWWTAkJgkJKAELO/sfYKf3ZGxbKvr7zj/m77VfPyzv/gvdIIhOwt/vU8KYeKJEqQWOVoK/dovrEXeD0hBsYVQmhFOswZW2C3/+VHU25m0SQvh1M9i9Cf6kwdTjEHteVd+Zsar7Z48ylftUbi7Oi2Dlf0X72FmT7jSkOW9VcJiSKa2RHVDjGCCuCYNNBwF8M0cG5WCPg7mXzxFuCuAL36hnct66vw4HCxjZs0V2Yo0fydPs3gGOPThgIBADr/YN4nXkE5sniX5FTWcGXMGJvFZW3qpUrScJXsPCOvRDKfoMJTp6UUh3G8DUt/TPEWwZN6l6YQbHEetNfQIwaawHCVhlVnVI2+UvgQePJXvRIc8HoiKGhQ0cOq0AZvo9zMvJBZpZHZnoEJFOs2PC2M5Hb4Z+ydWGuFm/xTaPanAz4PgPShpCYKkBdZKutcRgk68zQJGEPTYL9/mfxplEsgCCoziy8DR6fr95mJji+3wAmLxnlXnFl5WaIXIhJOUjQzDCR5FTKL9cRzsq9CAtlXbgQRJK7E8K8DqxU/uRyBQcFh+rcjT9gLI7TOKUil8b6OGqZuCDYhaITP8DsPFlEwZhYQEkIqqBg2mjCiaZGXf7OS9ltY4hIx3YoIPYPI8Bw3/4kvGT4J0iTxMjb4PH5PJY2Nd4odMPKCeoM9OjD2mI7wBOH9SVwE8qRCjjdYIUBX02wLnlulOAryEBVGhR0rWQoAp8VacAp3nIyYM6E+nz1Xq9HOiHIirtvGac/Vol9cESeDZtaJi7IIVLsTcYxNSeHsC+cxV9tU5sjtkHD+AK601wX6TUVnU77qYFo1ttfzP3kx7mf/tin/0BcHhwcYt2SZP9PAAAIGrR9EycVx2xKAmg4FKBL154PPvFi5y49AMBHG9CXngiP8MQaiaVMiv4XUFrGXaVSZG+VDwS52VmK+gJeDFDNnCAhSBIK1ipHCYxE2Myp1FAeL5VkpmBbrc4+ZOyW6vi8DQDQrn3Hu6Y/NWDQMFUKIvjGCUTB0mwH4MvNRvI0yCk6QNYOUJIEk3JT+az8HXR+rFIOGvBjhw4Jh0piqaMmE8/j6uunjRwzvqqi4s2ZL2zNzEA1DGgkQlMDE9kDPlgr5huDrJLLr7qpU7eejz7zyoznH9mwfikAylO4z8NLkhECAEOGnnnmWePT0rtHRccA9dXW1paWFhUezH/5hQeZSl5/b4HbHSMMauaMx1ctX6SYbhmA5BJQmQTlLV2eEJ1pgdRKxmgEJjGxcbPe+sYo/Pzj/yz46iO7iVWtW49+jz07yyibNePxVSv+UCfIMtwLaA78T2GMAEBo+w7pT70wE4grObndxg1rvF6vijVmcaJQsMYcjiTJ0VkNxw4z89KsD+PiEhg7Jf9H77vpQH4OIfDSrA9j4+IBYN5Hc3/64Uuurnn/ITFTR/w5c4tvdOvYMeMmdUzvmtQmJTYuoaqyorS4OC83e/2a5Zkb13nq6lRYjoUBv2lfo2IRRp42KamjxpwPAFHu6EkX/31r5gY+wwV5co0dQ8KdMncV8Xs3hg4f1albT6BQWHhg29aN4pc/7S1CasEiN4k33PLAqLMn4n6j3KFR7ujU1HQmh30gR0bFsFErB5t1TvcI3xenAxVPKjUHx66xDDJsWYd2ri6ILQ9EHpQlFUVXBflc0u5x/76s7Kzd6Z27tmnbbvTYCb/89I0qsBx5BDj6FOyo7yNDcgYhyUBA8w0gm4Xg5eph2FOsOs+ZkXVDNvtYOgAAXHz5lLHnTg4JC2ONWsfGt46NT+vcdfiZYxf+8NXnH71llHfr2ceApJrq6g/mzpQGKxiyn3E5VMA1fOYHVAEI+Lw+fXfEgj+Cv4eCNcw+p2kkhuPOv8g4+eN387xer/hteLxw474CCgDQrXufUWMmGiKUl5UuW7KwpPiQKygoIjzCHd0aS/fJe7PCwsIAICk5dfyky42/bwIAACAASURBVNVpF7YXVfap0pF90L1Hv8eenQ0Ajz1w/d7snYr62JKopjsZMXSJhGyawDUpLSte8vt/jWqFBQc4ZMegJts3P2TlS0ZMWdCpBV9/esf9TwDAOedf+OvP31H7bjIiiXgCoWGw5GtHKxnGCCjmg4FMiFHHU+9psL4JivkCgI/6BEYUKGfNgqfZHxIyz0286Mrxk/9mN6e0wePBmLj8z98Yj4TENkOHjwSAsrIShIOCvOCg8AAjEq5TcDD/h28+P2vcpIqyki8/fw9VEV1T+L6wdQwglQNAaof0tPSuQKCutnbFkt8tNmiXAXshh80EgHTr2Z8JMmvG41u3bLA1zoPO0j9+Mip279Fv/OTLRXXII2+8544YOc5qrAEysM8rTuEsUsY7pQCyh6HKB/Ny/jP7BTG75HNDO+Io0VDiycolcKQb1q0sKS5qHRsfH5/Us88pWzatl0yxyfCnEt3JhI98yqWlYKQ8Ie0+wiRk81xmz88P4TI0nn78dt53X33s0A33rUsgtgExKdQNSFqnLhdccpVRlrF+1XfzP9q3L8vX0BASFtq6dXznbj1TU9P2Zu3mVUn4HEtJTtqWLUuqQQi/g/nVvPe/mve+io3cKcHfUBeOceEZo84xWmxYu6LOU0uwI3LYIWaChuwRERFMz9lZO7kxEWHehaaNIQcksigkJGzoiLOs2qgjgnSt1JYgmBA+dSkqqEYht1XiLLJMgtvKzGVc5vnjxJ1S3+qVS8459wIAOHP0uC2b1umHqpwAJfRSVROM1n614FDzSFCwag6PIkhjk2SS2Jv4Vs4ia9AinRuIiYsBrwhRBbsE4PYHAQYOGWE0rqmpnvXys76GBoNRfZ2n8GB+4cF84Ge+MeN1Og1+rSOw1y46MbAiDTJnGwQBoO8pQwxJ16xcSnBFMR2zc2cg5PHnZnfr0ZfjC/CfD39ifQCB1Sv+eO2lxwBQgFK6koaiomLGnHvRKYOGtknpEB7RqrKirLioYN3qZb//8m1ZaTGuOX7S5VdcPQ0zfO7Fd5AR0duun1hRXmaU9Dtl6AOPvWTM/ovP3b9xw0rWatbcb2Ji4oDAij9/m/3yU9ha+55y6sQLr0rv1M0HNGv3tm/mv5+Xs9eePH5cr7+7wO2OFsBk5ownVi1fxI3dOhsSEjry7AmDh57ZvkOnVpFuT13NwQN5GzNW/e/H+WWlxWo7stjyuTpds2LJOeddAAB9+w8ihFjvSPYL/wJrPCTZQnXgKJwVTgmueOSIfccdx6CjRTgTBCQSEIL3s1hVlaaU2lNPNCWguieGmz77aecod7RRHBQUFBYSWmPhoExxCUkvzmQZGYlpHffOpz8aP+68+bLKior4hKQXZ75n6PrJh6bt35tldBYdE/vKm58YNf/x+D17dm1jGiGEjBpzft/+g9PSu4SFh+fsy/rtlx+MF/ZQPh/892vvxickAyGffvDmL//9Fp+Kio4+d/xFHdK7tO+QTgjJ2bd3z+7tPy34orqqCuUTZlbI0kO3Oya5TVvj3K4dW/xYCAHrLni+UFlT/Ik+agz+3aFjetfpj78cHd2a1YyJiYuJiUvv1OP8yZe/9tLjmzJWcR04CY56tMuI6m4BXlWWaZ05evxN0x5m2NO776AevQa88+a/xZQNE+X/YuDje0tManv/I/9um9qBJdzBwVFpnbqld+p2zrkXznzpiU0Zq3Vj4vulACR7z66GBm9wcFBERGRK2/Z5uft1SlEJpBMUd6lrC6pJdU4qddyckbfRFIyEINzEOgnUciQvEox/uP0sqgNBXW6ECkXDptwralTiGCGV5ObsNcpCQ8PuuP+pT95/I2dfllDd0l1AscQvWjBFuKNjbp42vXe/gayDrj36dO3ex3RG1ZjlMQ0ZdsZVU6ZFuaNZPz37tO7Zt//pI8e8M+eVzIw1FgJykECAdO7aw/hVWlxUXlYa+MB+/PbTZYsXAsCAwSP6DxxmnPro3dca6utZ3YMHcjlPINIbgJggkg/cfPujBggeyMv5c/HPZaXFkZFRQ0ecndapW3h4q9vvfeq+2y6vrCo32mRmrH73Py+lpXcbPXaSUfLdVx8UFxWyrmtra1Rj0UylvTEKANA6NuHaG+42tgWoz/fHbz8UHswfOuKsK66ZpnPPT96fFRoaBgDJye3Om3Q51w3+QSEkLOy+h/+Z0q6D8XvV8kV7s3bGJSSfMerc0LCwiFaRd97/7MP3TzlUkM+aAL7TQWLd0FCfl7O3Q8dOFKBL997+cBBUysdAgddwwkJNt9TScQa+gtCLMxw5SIh7l+MMBSDCuhjQzyMPgrIAihQVbWCxavisnigAEQ3bDvlC8OT0RgBg0/rVdZddGxYeAQDde/V9+l+v5+Xs27h+1eZN67dvybBuxQICUOepWbnsD+MiiUErl/1hHDTUa7NIWXYm0dXX396730DjR0NDQ2nJofj4ZOIikm7k1iZ169Fn6p0Pmzf5+WhRUUFMdGxIWChQiImNu/XuRx67b2pJ8SGhmcE+pV174ygAh+Fo7eqlxkFcfFL/ASYO/vHrD7W1NU4eIoyI4n9s446NS+jQsbNxbtbLT7Arvwt//PKFVz5wBblKi4tSO3TatnWDUb5v7659e3edetpoEwcprFy+aJ/yerGid56kPHHU2RNDwyOMS+uffTj7x+8/B4D//jDvHy/OjYpym3x4VksXmfsD3Xr0O2/S5Q4zOeqs89ulphlMPpz76v9++sooX73yjwcff5kQCG/V6vxJV7z/1svMYs17HIRME1Fezt72HTsRAm1S2vnRAAdzuNBWB58kAn+ghCc2j7pMUOYjoKTfVFQWVc5k7Z/Bqnogmd1RIQV+E+uGDyrq16QLLr7qgovNqxlY9Fkznlm/djk/Giv9IWJlsVsCQKGgIG/OzH/efMdD4eERRnHb1A5tUzucO/GSyorypYsWLvjms5rqKgpQUV4+Z+Y/MzeuueGW+wCgrLR4zsx/BTRY1VR269ln8NDTjeMlv//88XuvezyeKHf0BZdcfdY5E9S87E0fAIDgkJBrb7rLGGb27p2v/99zRYcKg4KCzh436W9/v5EACQ+PuOLaqa+/8g9ONdbfyEi3UVhZWS69vVxFCseTh4YREDuSAyBwxukiLtZi8NAzcvbt8fq8AOCpr7vv9st0CxosvJ9hmDdI6mThTvTpP9ioX1/v+eXnb4zCek/d/37++prr7+ImFzugIKDg49YcDB1xlgFtNdWVvy60Nzo2b1yTm5PVLjUdAAYOOf39t1826tu3OaCbXwWqtF5wEmnt9uhJiYBK8GI/dbmUAH8gqQNXAGkSMYqp0zpVTVyi0z5xqcZGdWZ0BIly+M2tkwi69RdkIZ0SaDuwWYO1/6D2Goky1q9++J4bfvnvt8LyMModfe7ES56f8VZCUrLCcfzhhl1P1fXgoWcYBwcP5H0wd6bH4wGAyoryj96drWNEKcWL5W49+rRJaQcUqI/OmfWvokOFAOD1ehf++PXSPxYa4vXtP5gQl5Ib2xitrqoMaDAOgVmd8ioPJKM1i8zfxcWFhQfyjAoXXDpl9jvf3/vgPyddfE2PnqcEB4XorIC4rDE6bIb4GYYhCNe6bWpH4yBnf7bHU8fKt2VuAArWGkbLmOB/BBihkN6pu4Foe7N3G/eHUmr+v3fPTgAgBGLjEqKM53AMToT7y+ozqq6qNPhEWUHOkWRlCuGKoGoC+iiXm4SvLKRiRGJIVN0BXxPLJncny4OPqYvX+rFDeNiif1pPO8g1wVPvqamqrKmqrLb+Gv97vfKClACgK5wOkcO+lEnLS0s+/eDN+277+7+efuDHb+cVGK4IAADRrWNvu/sx20AcUnjdGZXrWRtDsHnjWp/Xi6sY1iwTIdyzCakd0o3CvLz9WGAAWLbkV+MgNCw8ISlZyS04ONSQ1eeTr4A0hoisGh1Rsz5eCfC8KPXNmf18TXWVUT0yyj1gyIhLr7jp0Wdnzn7n22uuvzsqKgbXN/8hUpE/KTTEtY6MjDJYV5ZzAbKstJjDJH2vyscRgUB4RERoWBgAUAoVFaX4fk1CoKKynK3R3RYOCqt29uAP7sLr8xkHxh6lv2FiiNClWsoDTJR3KqEXnIoJi1bgk0TlgQMgCprFCRZaM2myvyOBiSFnP3/OlP4uS86yr+9cPH83Om+dCHGrFEsk7QAA/PjdvO++dLp/0CLK/iGguMKpCGOoHx+lO7Zl7tiW+eVn7/buN3DK1Hti4xIAoGN6l7i4+JLiIgUHFfmrQgBoUmIb40dZaYnDotGBc0rb9kCAAi0vKRGqFRUetA5pTExr4+4fgaqrK4zht2oVGVjnGnFs6R0yRmb9RFUfL3/I9q0bH7z76vETLx845PSkNm0Zl1aR7rHjL+4/8LSnHp5aUVGKJ09a6CqXV5zUAgUHh8jO4bhXIFmp7Fv4ggbvtsb+hvDYDvvpIoQtfo2PhAsVTDZUBMdWkZFGtaqqCr3kWFymeWHJKFfTkTIxBDTjulNCHQf8lY+pYDP8KOwMXLhvBvhhc902O9WvfmNxViTrxVe0zzqDoZkABElvB6BgZYUi08aIK1qokNSb5yxhiLD1YtbcvHHdvE/mTr39QaNF29SOxQYOBiZJcHCw/iQFgNKykoTkNgAQF59olJJGTkpFWanhGvEJicKpKHdrNr78vBxl86rKSqPXiMhWjekWk5Xf+SGi+UUlUzYPSooLP35/1sfvz4qLT+zctVeXbn0Gn3p6Upt2AJDUpu34SZd//vGbeF6la+vSKtQ4ovaDRpFR9soxLCwc/2RUVVUZ5Y4GSvHiFABax8bbICf7r98VA4G6ulpPXV1oaBgFiHbHAAI1QsDtbs3qlpeXspddCMAsXzg2QhqlUFXpFweVQcih2mGSXz66GVTKJgAoUY2CgPX+QQEBgS0FcSfMTJoNGcv3V+zZZvxfuWdbdRm7nYJXvc+j7FSa7sYKZr0WCifLioybMJUQ4rLREGmrwWPfCJKflwu8ml2uIOAJ3aJB2qSkOkt5IN+EpwGDhoWFhuEVfKvIKF0rTLm5e42RJbVpm9apKz7Vb8AQ46Ck+JDOJSoqyoyD2NiEQLpTUaOdpL6hHk0B3sUW8g4SEhwCAMVFBatX/PHpB7MeuPPvmzetNc51NL50aLcCH/XZMrG9Qm5bBADA3OMjAADt2qez8gGDT1dKm5ebbRy0S+0YEhLKynv1GQjAkjTtYJ3T/D27tlIAQqBDWheXKwiDWlrnbgBAKRQczK22MjvlrT5CYaz1UhI2uXrRODaOlY8KKbPCRtd08XkmZxDCgkF53DLE9+ytxifYJUtiJoYEVW2UcJQCWiwQ6a8dBChQ2iG9y6tzPrt52gPDRozukN45unVsUHBI69j44WeOueaG2w0eJcWHig8dNBoVFxUahe7omLapHXDHVZUV5eVlxggmXnhlUnIKAMTGxf/9utt4CQkA2bzR9Oro1rE3TZveKqIVARIWFn7BpVfzNbW0fcsmE3kJuen26UyY/gOHnjfxUsNFli76n675/mxzs6Jdascgp+zVH4lo40RlJUVsTHFxCShamwdnjZ30j5feffujhXc+8Cy2YZ/PW1ZSZPyoq6m26putKsvLWRftUtP40Gf7yaHCA6z4zNHnxbSOA4CoqJiL/jbFHguizIw1AACEhIaFnzV2slHYqpV73IRLAUD7TURrTHYep6Lly34zGUZGnX3OZFZ/8NAz26S0N04tW/ILlotbMRCF4jukdTaY7M3aDU50DAJfixB7z4K93BAWm4IGZatpAcK8KYCXclKaH1zGa60A/QuhJgGAS66YctFl18htX3ruoV07tlptTLUMGzEq0u0eOmL00BGj1cyp773//B/jti97j6euztjkfvL5mZkb11Ifnffx2wUH8wEgY+3KM0aPAyBt2rb75//NraqsbBUVJcyE8e/q5YvHjb/IiPwDTx3ef9DQQwUH4hOTHRfU1ggBAKC0pOibLz687OqbCUCblNRnX5xTfKggJCTEHRNrjC4/d//3X3+q45Odtauhvj44JCQoOKhd+7R9Wbuc+/UvUABUVFRQcCDP2PWbfMm1bmvvsqKyfO3KxQCwZ9fWKVPvB4BTBg1/6IlXMtatrKwsDw+P6Nq9z2lnjDGYrFqxSEi2svZsb2hoMFQ3Zer9HdK6lpUcCg2LiItPLDiYu+Abc2e56FBBbk6WkQnGxiW+8MoHWbu2pXfuXlFemr1nR1qnbkDAhS6vL/p1wYTJV4aGhwPAlddNa9c+rbiocMSZ41wuF1ATt1xWShYblzh46BlsphOT25rKodBvwNCY2DijWkVZ2YplvwLAkt9+HDvuQuNi19XX35XepUfO/qyUdh1PP3McABAChw4V/LRgHtOxsNSXtR4bF88uquzeuVU6fyIS8yUK9tO7gB+5Z6dlcs7nm4kUsdJK1+z+myZGUJArKChIEUSJ9ZkoavEmEBMTR30+tJjiqKqy4otP5m7KWMskqaqqmP/Zu1deewsAhISEDhh0GgBs25zxy8/fAcD8z97tc8rgWMvoI6PcALSivDzKHUUJ95JwSuHtN2bccd8TySntACAoKMg4qK6qPJCf06lLD1MZEuGiX376Ni4haey5kwhxUYC4hCQ20h3bNr375ite/WOCDfX12Vm7unTrCUD69B3QdBxsJH3xyX9uu/sJ4nJFuaMnXWQmv/uydxk4mJ218/23XrnmhruIy9W73+De/QYLzX/+4YvlS3/ly0hlZdlP33824cKrACAsLHz8pMvYuT8XL8QLgc8/evOeB18wptvtjuk3YGhtTc1br//z0ituNurj1LikuPDDd1+74ZbpQMDlCho9ZhIQqK/3zHh++kNPvAIAQGlwSIhROTkl9Zob7jHsl4KxZWnuXY48ewKl1ADMfdm7DBysr/fMeOHB+x/5d7v2acRFTh95rn3HK4VDhQUznn/AWBTrNsCAL+nVd4CxuC4syA/oAaETgPB3Ow2i6usPOGMUthKPABrab0fA4ondUvCfGaJUi0hDQWMRhkrhrdkvfv7xW4NPHdG9Z7/4xKT4hOSIiFZFhw4WHDywY3vm7wu/r60RH8z65advD+bnnjvxkrbtOoSEhOTl7mP3K1SUlz354K0XXz6lR69+sXEJRUUF69cs/+n7+X1PGXzjbQ8IfPJz9z3zyB0TLryye88+7dqnVVVVZGas/eG7eQ31nn+9+m5wcIjyeiUu8vl8n30wZ9XyxWeNOb9d+7TklLYlxUU5+7IyN65dumgh1S3JLFr556Iu3XoC0FNHjPrxuy+cKzcXrVj2W0FB/sWXXd+77+CgYHGPFQB++fnrrD3bR4+Z0KVbn/iE5LCwsPp6T1FRwc5tmYt+WbBzRyYASEZCPv94Ts7+7JGjx6emdYmMjPTWN1RWlRcczN+5PRPXW7922UvPT7/g0us6dOzS0FC/fevGLz97e9/eXWwbLjwiAtdf9Ov3JSVFky++ukPHzl5vw64dW76e986unVuqa6paRUQCALv9HgBYjmHc8W59RIFS8TE4kw4VHnh8+o2jxkwYMmx0aof0Vq2iaqqrcnOy1q5e+vvCb9l2M0FmzUpQlyYNGzHauJay8s9Fis5OSCJJSb2jo9sByv7kt7Qnp/Q8mL+VlYC0p9jSOHjgwK7WMSmgRjlhHeBEivwWr0WldalN9rBN++VuRhCaoOvJDiwbSZgZFw8CHfxhUEREqxmvfxQWHg4ATz00bf/eLE+9+tbFlie/yz6/zUHSmRDilX+hmefz8MiwROc3DVHeWwlASEhUbFz8izM/cLlcPp9v+p3XsV1sJZWV5Se36dJcMh+zVFmeb18nwe/jZDXk2aYqS2x5o9BtNVPprx+yF9JCNsv+UlTBHifPHD/ASUyVUeCaMJmaST9YSnEDV50eNx/V1FSv+HOR0cNk67HFo0REc8zIWdlE4kCkA7kJVVlay+8JacjsnigK8QHOCtnxxAuvJC4CABvWrnAGwROKXMxP/b4vlJEy/dbgVLOQMuOjUh0/LGwTxsghM9aZN+UlYXfoUxRDEGmf+ztcMvCWAN+tBcktRd/M/7CmugqADBgyvEu3ni3X0WGTgxKUYV0+wLFRiPvO3FqQAvQvISOg/KnklHZnjB4HFOrrPV98+k4zi/hXJmNL3p5mooqKbFFsENO1cNBiRJBAAvZCgM4vpAFckobZCMcUNSCsmQF/1FgaU7DvXMVPcQb8nbsmkC0rD4Ut2GV5acn8T9+l1PfHr//Nz1ffcX3MkzLXk09h4yCqn0cnE5TzOyXqKZYMVnlpSfHC/37j9Xp/+HbewfzcFpT1r0YkKam3O9p4Jkm3adJ4pocvF08HDuyKiUmRigMSz89ghM0fuZwdsy0ZtEtIqflZS/apMOG9b2o01Jlqo8mWkn+3fvNwF4gQkto+bf++LAA4evuDLU0Y8oT9QeD3OYStw5aSRpeLElWJnBrgMYSERAFASrv2hwoO1KO3QOroxNkfDAYAzbv8mg6CuslrVqK8pfqppC0VFvnCkgisY+CzUqMuZYiIqvGbh1qxmoeI8CKsFk0JKaX77VfPNtO25zFHAq452HKLgyDo+xYwWE5rVUBpFuQ38j2SJwK5wHYehd83gQRerDBAY2mMTbGunJYqWqQUlhbCBhHwgEgBzEfZ2fd5uTWS8Goj+Q0fLUT8Z+fwC/Natm+XK6RF+bc8ORsam3ulGgXLaHGSvQmQVct7PHJDcjxMWQuSC6ytLVToJ8kKkCjAyL4jvu8TazxvKeTquq1cIkGTXg4GRNoqingtRHGCrBoEbBOagfmBFGtn0MA5ZcIgv/GNExkL1wTi3ZNyujS/4tJU1oFScFCoyxV6tHbKmoMaKzlVZWBHaK+QSD8p7yyyHISrTIgrNDgoFE6ShvB91Di6tEiUo+L0iGm8cqGrMTTCHyvWvn6I8EArZMPAmRu715VS8+tO9s4gALuRkO0JOn3hx28iIkd5uQLBBdw3Nq0eWnzVFhwUCseKa4nByOG92fwp8xIXuhOTe4jAuvp1vG4CnCSTgsGyDPTicHHWzznlzKeTXODyZh0s8cQmpJOK+WvXzyz1paX0fKpHcvcwqKgu+3nb5hkFHgAIdac83bfT8Ogw8FTl+ULgEABAfGzHR3unDooKC/XWZRfufT4zJ7PB7Az/DUvqtaBXw5N/7FhuPjTX6ubhQ/ru//PSA7IVNgLoxFLGQBlnhR7MeGqWEELAeiucXYt/SRyAfZ3EOqmSRgn5Drk4jlBUOMMQkL2pW3go6Pj2ZBEE2YGgGbBXP9xbzaUlEeYGx7XqThIAe9Wz6nMfPEhU7n94/aGw5ARP1vqZxa3GpcaEhra5o3e8J3f7Cxu2fVISOql351EEAMKv7N19cH3uP1asfnh7SV2ICwAocV/XN71j5d4nV6y+Y/2ebHeX+9qHsw5wN3VVVXkhrdKCLWcPCk9r5cmrrFclhfI6VjyttWt5iSOsjtEWIeWXHwIC4vfZ4bWwCIKgWYYLo6H+zvojdL0Yt/zrrl6bQjy62YWGkVM7MMmhQkgGoUWvO52kY4fMdbHqfgsuNSoqL15WGnmlL3rToYrtwR53TFgYrfh+8+bs/JJsACgLHZWSmBYGUB/dz+35fU32wlKA0qr4pOSpACQstm94xferchbVAkBFRV7qf1rHREFthdQN1Fbm0bYpkaRvdM8pITlPHnCnkJpNlQ5urIBsP5ar2MyTTkmLdmpWo4QQdDHEeDiUWC8NNuFKvTMIPJyxv0QSAI/JeZdClT+iR+4wixOHWGQTSk0lEKRlIl1w54lIUHiiKfNEIfO+GTDnW+851Ac+rwd8HurzUB8QEtrgTUjodH9vd3ywCwgALVtOAIJDo0jdplqjja+iwQcAoSHBblfM1NFnTWVdlIYlAChe++mtyq4O6+t2j2qffFpo/aDKkLb1VdsbQGV8HADIa1w/pMy8VFzMWmY5QaFCBEH2phBUn0sPqU7BhIdFoURH2jrm6g+NBostd3+ckYyABi4qcmwlCDJ3kF577rxtcZL+wmTmg+z76I7TTNiakgKExKffnOz7PmPtolofhCXfNzAWGC+BgQvAV/Leyh3L2MuAfXV5oKS6rGrvOQmpUW7q8SVMTGkIq8rJVidEolE2zjaVqEm4Y+FdCQykrJTQ2Bi0eqdsnxCsEv5Yu/uq2pSUB6OcFjl/xFuZ5r8y/FG+5XFOwpYDf8r+DCx+VJEqVs0QQGg6SX9Vst+hRtU+KhIzpqjw0NDqkoWFFdsBwHqdFDR4KmhwfBhArd2kztNQAcGh3qpNlQAAoWGh7rqGOlAS3VtR27Zrsqds33f17S9pE5qXXVUBStjCmeBhmybaDWRPgwifeLd+mt+DFb4RbJOV+omXjP1mdn4vjwgOLXg2D25oN5Ilg7JXH/+pjQVw6sUvRXkin/0RDIXy6zhP0nFG9n3UAd6Cy2yhss7jaRU/ITm6rzt6YsfENFdYWuvweG/5psqI4e3j2wZBaIi7e2QIAEBt6aZa97juHUbFRA1K6vjyaUNfSAvX8c+qrPIQyC3M/7SgtI648quqPWqRjOTU9Pem3zFHbeDAz4FQtJ3Ov+uGGLmWsRi2ytS9Wx9AkU9IMgi7hLihA5jKi2ti/+K/T8+uHDjkpcchKZ+XR2dt4zdvDrWSPkudhC2QT9JxTHh/0PpjO4l69WSU1h/K+s/BPtf1G3xJMFRUlSw/CIP6dB9VmPHJll3d+/b4ZGxYmK++gro8lQC0/L3Nu9N7dnzqtM5hXs/2/B0v7K8FDXmqqnK91csPVuc1FGV7I3IrFLuDwsbN4ZqphAwEXSa2F5NcAoq+QCZ8KtG6h8aQjBDLpYB3RmF3D29AYfUL5YK0gvzAacpMXG1d4Tltatg4jsgweOGpRHmlzKYBXX2StxpO0l+bzPcs8HN8zO0Hs/ewgr3SMY+bsRd7MYtzMWX+RKwGeFsOL4OFCCIgGlFx1kGTs6CYNQAAIABJREFU2GkAI7G6s3hTKdQJk4siAIC0v3u8kaxsIU6ZL8xHm0XS1ZITgk6c9yyYz9UdkxNL7QM7GTP2bmTIaQ4yV7sS9GCR2E6Reas0W1dbOEJQS8KDHWg8SE4M5Z+sUEgq2YGc59k7/4St/aQ0knAgrb3l53gjpl15qinaPmDZPn9lWanuk/QXJvwJVyELOrr+wHs8kb9JwnZtGifnPQ8+O+jUEQBw/gWXT7v3cZsLnx5FhEe88vpHnbt05yQClvRx11POGjfxupvusoUivJNgBFTsc1p/CQDAvQ89O/jUEUDh3oefG3vuBYomSigUVtOqFuY7Ikwo5Nbbt9396LDTRzsmpY2m7r36vTT7w8P5zmf7DulTbrnncOVQ4RX7dcf9T8TFxbNy1e4r5VsL6j5Jxwmx6yTH2qTKoCwvVrnK9zz43Nsf/RAZ5Q6wg4y1Kxf98oO5+JFY1tTUfD3vw/y8HKBw2umjL7jUehk93g0U18J4o5Byq3bC5xACgMupIoFffvouc+M6rrmwkAUJW3GSw5bGlLUgSF4uKwwwkjzyzMvRrVs7VLji2lv6DzzVOM7Nyf563vsOn8HzSxdces3erF0AcMrgYW99/MPMt7+Y9c6XL7zy9k3THohPSMQ1g0NDZr0z/4nnX2Uld01/+qLLrmVKGDh4+NxPf0xMTmFjvXnaA2edMzEvZ9/Ei64EHi1xBo+XSmhXgRXImiPHniudJP/ksmZSOalgTGpSylF8DzvexsYl2NpobFx827apGzesHnzq6Q688Aj378/K3LhOuwoksHjRz9VVVUAgKiq6des4BEZoE024UkwId6VZ7lWZFXIyEOPy9Mb1q/Jz94mpH05HAB0TyQGRsozL1nwnViVupSyKIlBK2/ZBLsV34xjFJyRGtIo0jivLy//84xeHys4UGxfftUdviwPZvWPLHTdeevv1F//zmelFhwqe+ufr8YlJrPLAwcMzM9YmJLRp0zYVAIBAxrqVvfsNYpoZNOz0yoqKQUOGG4MlhPTuO2DjhlW/L/x+yLAzw7gvyfGpMoCR5BNTi4oAzJPOj07SMU3B1j4W8D56jGwJa3Zv7EKzwvAzxqxcsThnb9aZZ5/3x2//FbjEJyRfe+MdHdI7H8jLTUhMNricdc6EDh06vff2awAw7rwLzzp3EgHYsml9epfuTz44DQi8Ouezpx6elpSUcsU1UwGgV98BH74zO2v39mtuvLNrt56hYeGbN657Z84r7KuJAAwcISoq+pob7+zSrWeYWe3l2traPv0Gjp/8t38/+yBQiE9IfuL51+66+TIgkJCYfO2Nd7ZP73wwLzchMYkQAgRuveuR9WuWr/jzdwA4Y9S4cydcHBnl3rlt80fvziorLTWGTojrlTkfz375uZ3bNgOBmW99sXLZoo/emQ0AY86bnJyS+vE7s1vHxV815bYu3XpWV1cv+PrTZUt+BYBb73pkx7bM4Wee7Y6KmX7XFKbP/gOHXH711OefvLeurvbqG27v02+Qz+vdkrlh7hszpt37WKvIqH+/9v7WzRkvv/Do8DPOPnfiJfGJyeVlJfM+mrt+zbLzJl06YPDwAYOHX/S3a55++M6Y2Lg77nvi4XtuAABLhl41VVXfMxnufqSyoqJTl+4JicmbN62b++aM+joPm9juvfptyVxfVyt+CrWstPiree9HRkVfeuUNb776glF4+sixC3/8uqa6aujwkd/O/xgoZKxfedX10yLd7qqKCldwULfufT6cO3Pc+Rf9tOBLAOiQ3qW8ovxQwUEKNDdnb3qXbtsyM7B58dHKvHVGurFM3l08iYB/VXKhbF+ey2MBBIU8B5ugjYkjzhy7YunvG9atSO/cLTYugWNDyLR7H1+/dsXdU//+8Xuvi2cBBg05bcTIsS88df8T029Nade+fYd01D/dvjXz0w/mLP7tp+l3TdmUsaamumrF0t8evX/qE9NvjY1LOHvcRO6LJOZLCYlR7bH7pz4x/da4uISzx03SKZMAmXbP4+vXLr9n6pUfvzdbFI9Cn36Dxpw7+d/PPTT9zms9nropN99rykaAgi9j3apefQYAgfj4JK+3/pRBw4x2vfoO2Lh+FQBMu/vRzIx199xy1Ttvvnzltbekd+5mVLjimqnvv/XaY9NvMV4gBgAd0ztdc8Mdr774VEV52egx50dFuh+8a8r0O6/76vP3AWD2y8/VVFVOv/Pal194FADycve/NfvFO2+6bMHXn9047f7gkJD/fvfF+jXL3pr97+l3TqkyPvJrzZslw9/nznn5yutuTe/SHQDCwyP69h/4r6cfePLB29qkpI4eMwGPOjEppeBAnp238rR8yS9duvUyjmPjEtp3SN+SuX71isXDTh9tNCkpLtqXvbtX71MAoEfPfrt2bNmwbmWbtu1j4+IBoE+/gRnrVhrKLyjIT0qyPgnL53uUu3OU3Ugox2bgrVE215N0rJML5YMGsc24oz+F1LJFqZhbB3bp1qu+3pOzP6u2tiYzY83Q4aNw7dT2aRHhEb//bwEF3/69ezIz1tjnCAGAYaef/eN3X5SWFNXW1X7+8du5+/cieyb2ipICAHi9vnVrlldXVxUdKli25NfU1DTV3dTU6/OtW72suqqy6FDBn0t+TW2fxi2TkWrbtU8Lj4j47X8LKPXty96TmbGWCWf8OWP0uB+/m1dWWuzxeD55780+/QeFR0QwDhvWrOjV5xQA6DdgyMIfv66qKO+Q3sUVHNSpc/dtWzLatu8QGeVe9MsPlPp2bd+y5Pefhww7w1Dopx/M2Zu9u6621hhYXFzi7fc+8fYbMw7kGS9tJ9Gt45KT23m93pLiQ/LUZO/ZsX/vHm9D/bLFv3jq6vAqVaC2qR0jo6IFGQCgtrbmq3kf1NbWFBcVrl6xOLV9RzzupOQ2hwoPqmMHheKiQ9HRrY0XWww/8+zVK5f4vL6tmze2iohK69TNqJOxbmXvfgMBYMDg09avWd5QX5+xbtWAIcMBoE//QUaQAICiggOJSW3M2aNC7CWWnekisZKUQHmSjg3SzAm+nEelEBdott/s11nM5aV935Z8jcAW7O/X3ZbaIf3VOZ8BQJQ7ZuCQET8tmM9qx8YlFh0q4Brw3cTFJxYVFZg/2aUGIpm61e3pI8cOHT7K5/V26tJj6+YNKvEJAD1j1DmnDh/p8/o6dem+ZXMGt2PHkJVAXLwlnllOrTMmJSQmFxcVGiJVVVWUlZXEtI6tPVBjVNu8ad0Nt90fHhbR95TB8z95Nygo5JSBQyMiIvbs2lZf50lISC4uOsSEz8/L6d6rr8G2spKlbAQABg0dEd06NnvPTgAAQn773/eRUe77Hn2+orz02/kfrVm5VBhhbFz8hX+7Nj4hqd7jiY5pHeQKVuiXGvIn4e/k5uft796rn8CtqrLC5QrGrXyUBgVLe5FWjI6Niz9wINdArYsuuxYAhp42CgCioqNHnnVe9p4dALBh3arb732cENK3/2AjpV2zask54y9YvuTXlJTU3TvMTzAGh4RQn3mPObXR0LQAyl37F24vwxdU5PX0yY3CY5JwkELTFYwKhe2PQDcHsSEAOmiChNIGjPyqD2EoEBIampCU/MAd1xjOFhYe8eqbn7Vt1yEvd5/RoKy0OCk5RfOGaAoAZaXFySntdm7frFiC26mecW0Euvbofc55Fz7/1L21tbWjzj7v4sunIGb2R+q69ugz1qhWUzNqzPiLL78OgFCfLzLSLXAuKy1OTk4hhFAfmhYkRllpSRtDPICQ0JDIyCgT2gAAwOOp275lY5/+gxIS2+Tl7iOrl91w673BwcEb168GgNLSkiSDOaUUIC4+8VBhgZ2XUlvrv/703eBhZ9x42/2zZjxDKa33eL76/P1v53/Yb8CQW+58ZPfOrSXFRWhm4IZb71+25Ndli38BgLmf/tfUDwHxwhEvAxhRp/CgNBFiu0MFB+MTksVKVpQaOmLUpvWrgUKX7r0KDuY9fPeNRu89ep8y9fYHPnjbRcG3L2sXIWTo6aMOHsitqa4CgMyMtdffcu/Q4aM2Z27wWU/Ex8UnbducYajBWPoS8xDQ7foY6vBqSWnsspmd3D08SkRUwAcKOHHxFXBGBMLy02+P0KSpxlt9uHsjLyJAAEJVBmdWHzRk+P69WQYIUoC62pqNG1YZS2OjRs6+rIaGhvGTLnW5XIlJbfr0HyQIsGbFkvMn/y0xMTkoKOj8yZfFJSYJXdVUV7VP6xTkcgGBqCh3eERESEhodHTry66+uba6Gij11NW2iozCb+W3q8XEXnb1zbXVNQA0P29/23Ydevbq73K5hgw7w+2OAYCcfVn1DQ3jJ/3N5XIlJtvisZtuVq9YPH7yZQkJSS6X68JLr129ckl9vccWjsL6Ncsvuuy6LZnrASA3JzsiotWIkWMNHMzZl1XfUH/e5EsJcaW0TR0xcuyyJb/wWG9Ovo/63pr9Ykrb9hMuvAIA2rRtF9O6tdfry9q90+vzEuICgOrqyk5dzO3FqKjoKHe0y+UyEkwD46qrKtM7deWmiJehTdvUESPH/rlYcR1ZCFKFhQeMK1oCRUa5J1x0Rc/eA7776mMgMOLMMSuWLmKq2L5lIyGkR5++hgIz1q26+vrb169ZbpxvqK/ftGHNVdfflrFuJVNCfEJSYeEBozkgI8RJHb8AwXaqXD8pBqeqf5JanowM33xpiuosmBFYuM0VYyaVSiQO6K/QPvBpF1YRQhPK1RI6IQB0xMixK/78DVdavWLxxZdP+eqLD4wSr88785VnrrvprjHnXrAve9f6tSuFzpcvXZTUpt3DT8+orKjYv3dPUYGYraxZ9WeffoOef2Xuzwvm//HbT6cOH/nP/3unrLRk+eJfI93RQMjG9WvOHjf5jvsenznjWUOtGzesPvU0q9qSX6OiogGguPjQpx/OmXrXw7U11ZkZ60pLiwHA6/POeuXZ6268a8y5k/dl7V6/doUlmZmBrlj6e0JC8kNPvgQAmRvXffzu67ZqCACFjetXTZl694Z3zA2vdWuWjz13shEYfD7vzJeevuaGO84578LSkuL3336N+3o3sQwFAABqqqtmzXjm0Wdfyd6zMyIiYuSY8fHxScHBwV9+9p7Bbd7H70y+5OoJF1zx/JP3zftk7rU33nH+pL/t2L45d1+2weHnH77++3W3vvDK3P/M+nddnfUSSq935oxnrrn+jnPOu6ispOgDQQYmCz/xe3Zuu/KaW0LDwjx1dQDQqWvPV+d85vP5yspLMjesfe7xu+pqa0PCQoecNvKZR+9gY6HUt2bVn8NGnLU1MwMoZKxbMWrMeUylhm0MGzF6c8Y6w4KiW8e275i+L2s3hjpho5CKCKfcPhJWMqDZycF6P0kSHaZi2JoPHwDlp4LYT2AQ+x0qxvPF7SwBlNhHklJ6FORvFToVlsO4XBgXThXxciJkzPNjp/QPsqqUfn3nkvm7KcfJqB5y8MBW/jvuorbkNXPT6JSBQ0eefe6rLz4dUG22iQSK9SCqBKrNI2krQelfyh51xwHwwS8Ew5+k56dKubJrMdfV8H7gsRdWLV/8x6/iXVCK7ThJtWIdUNUHmHzJVYlJbd5+4yVAm4NgsdH3INTFJGu/MWM+xuhYfL5Ynln7lLUgUzdUnSUEgFaW5wfzziaENV2HigaCD1KpgsCIAnhWvbF4TyQr8Rbt40EQVPyoSki766ahYcf0rjn79riCgkaPnbDyz98DbWbmww5ZrxxXrBKKoFDOq+WfykJBy0r4k7wS3+djN6e4yPpMm9NAmo/kyAkAAPM/e3f8pL+JOCjkW7JqcaE/Ybv36jf3jZdAMjvQqN9SKpF4M2kCSf1O+NWxg5cq82n5LFYs3vqX80HlAXe1gAAASUru7Xa3dcw9aFJKT5wPypmdMujKjIRj3FxlLzgf3BIT01bTiGvaBDcNDgm56bYHOnXqVt/QsHTRz/9dMF/9glU/JI2SsitPygABGs1pMkGHPnUJoNKnGfzySSIvgsaGOOM7IgmN/BYfylseI51RyLjJHduvHWc6oVSYSFVTgrhyelDmA7L5K4U75qhl80E5f3eqjLI5bBXK658M7AzCb1dWvCEZKivyrfcPiqeEdEw7BF2CoozWRAOUoFWCXKwO+hokDYga6uvfePX5JjVVEn5cWzdckOTlvT1AUiWaYrrMzmLboCp7oKgqUFXeqEqcmpcIbzqCiQtWiWsK8UAlsviTAgXKJopdLBbrSkDI3kxuJs7iAJQ/lYFQFxSPLukzk+YlM/JYkdnsHOEdqHI9TlIe12RM9LNnZZPLFIPLqKjoTzwf2dHwgWwIypAMeOxq2QhqreuB6Az+iBMKDcbs2nee2XjND0cYWsAk8wP+WNYFARDiqMqubN8mRLQe/DMQ8WVTUImk6F84cGiuAC2eOeFrEsA2ZSMTD0fGtql8lj04jlQoz4KDjesilYyPR5Gw0TbeMhvRD+HwixGldrjGTyhYT6xyx0JbmZXARChHvQSbHO1cAHgtGImEohJYVTE5Bzgh2CvraPgJaSXmaZvRMRBSsU0LojKtSgmGoq2KZJ8SemYd6iFG+aIc1JaYj9ICb0PCewmp9NdBWr/DkcWgGhORIyrh2yqzPzkDY/bPv2pJSCwoX65Vmtgv5cUC/liZtR47JEfXFuoHZXzsL7oD164mwKV8jPkYOSZlc4kinpwqIiYuQGLwXipkhahH9FeuSlSVQWPY/oKOfFKwIYq+r3jsmJWQCQpegdFQ0JnjCIikZWUSJLs9SvHx6xPNRoSvZgiGb7nC8Zk05kswsvmoDYqvoERzHQLqkmI5VhOFmWK8xYyFBTKASl2CtGAFEq5pY02y5QFI2yORtKwXXonzupqmwgkq4bGPC7FUREPFrTASqJk5PJepm0Mw7oyhTADrdkLWkACw97Cqlkgo0mlGi1ETJHsS7FlO7YBv7kDB4aENXvyFOzlDOHZAEJPgEpRXgwCXikFpiUraV/Yp2SuLmrYcWBAWDk2rsiaTWSSlASlaB9MIkRWjZGeVmhDyL6XZgSZ8y2YqFdsJBHvHlsXEHLftlVb3zMfksXOjwgeEV4EApcog0KJE0Wxxem/welwul66Z3Rr40cgVRIOR3tpJePgDK/TaO0tWiodbAV8C1I5RIn/2pRn8ziCC7dmF61sjUWYd3GhkMxMOlBYr1w8MvDwhroja2koLCjlLDzwyHVlSikN43TpHXccBCcPW8aDqTsSsTpGWo5RQNxQH2ZRBT1gOOMgMKtOR6zuEVhlPLMXbda0sQU4+GPAJqQPjRQjbLCIioIkpKpshLJmQM2ARHXzi8G1cBlkiqY8AUJ/PW1tbER4uvdWYqMZoT5aQaqGOhKUuO8B3Ndut8EfQqIiwMiCClMAzVrrLLGx27f1BMBE5ACK8IYkSKs0e+MkHx6lW9QjR0Unl5QXV1SXGY6HOxqIl2UypJL1YQTARVK6cY7DijPJyPuZ0pNJX2WI1VaAZxRIU2fwdHAWSszb8V1fhr0oulys83O2OTgSQIN4gOZEFEHM6AC7IMFJu/3E7htTmqb7ay7sutSBMeceM0KOKZzDjIkEh30Dl2IIqBJ0IejscoyCtomNaRcdI5VR0saNsfLS6HIuh/K6eHDaU8bV54INKkyScsuVjd5AQSikxPgijs37lgUwOuapuupQlGpm1MsjopNOAsmsiVVOGeos/BWq8ZoLddkqYDillP/2ExmOThORaKCf23ZdWub8bWTgmDKEY+hAAKiYZIMGrmTBaXeCkUoBCOZm3OXNdmNeLqTBUAuizu/wgsXjoLzY23FUjZl5bW8uD//jssQCFHAj63UsjklsBr0as4aaQMB8ydwuoCV4CE8ulcXN5snX8lcdMHqofmM5ulDoCZvSqUwBiOUjQqcwz/JKEueY3Uc3gYchFhbNqPiDpU+avLGkhkuOK7NvUghKWN+lAEIBDQ2ZglHJD4i5x8EtmzIEx5DI+goS06vsNNthCLEFcTBgR9W3DonYHPE4TlTlxFo4uzojmgI1eThwCM1NrGwdPyNENuWx6zBc32d/OFOvYgVZABoLOcg2a6rkmO8wCc7fshgKnSBMZKRKUcZB1TPWKx1MpDFLJRABZqqrDWAv6wihPVHkiqEwLK0fQDy8qZZ/0Mp2OGn8NEDRrAPZboJRSM0bzI2HSOoO+DgTlCKQ8SzTlQgnryAY7IV6i97Vgn7Pdm8ETlZhTfixWfXu8SGkMZ5RwJuR69jDRfiJhrMD+KyiB8AMUr5OIOiLiX8WVaXuA+CobHhRGKXFhTniDcChUEP5kBBB/tQ+XBnZ9/P0z754c7q+eaC/GDwaI+DNOskHK0YHj2FTZteCKZoUIG9s6JlhWAWVkgFO6HDj6tuCEmOTIALypOIiPoQ17iPAXQzAgU2QF9naWNbOEsDc8EkIAKAFgi2KOLWMhSwWS/FgweVy6WILbOpxV2hbWOZW6kNEAt7ezJcaHwQEaGAEbFhkHtraVL0vJNskBqGpEXF8Q4LfZxc/LmtPI8aWoC2T7vCoY9OsgUsR3B7RmSQHmFh8/+a6uwzqGR5D6oh37P3tt305v8s1zevYMgoa1Wx9+6WC9NnQCAMCgrs/cHPLlHVsyPNoqIoVETf73wDbfLJ3zhw8AoNZTUVpbVuXz1wwDDCO2C6ImQW1C+sUKWUkTAREDjc2a65kiH7Y2tlD3mANVjVXOv/ApohoG4RkKnqlsArwAAnOhUJaEnRAGIgAxRmQxMTT1YxzbySAhBAgrIZbT2u/xkjfOZOwLJAAKUlG9PuVxC3Cv7JTZBluxmv9S+y+gbA4YOKCUTbh+KJSAdcFeWGjivQ5uZ5Afuy7EihRQDOFw0A7zira8QGyLFFSWxJdjpKaAJkwWUrYAMGICxI/scHpM2ZczMnO84f1HJyS3hZ3bCr98rDptQt/LzRSNEvH91SoNNIJ44bbs/b+79gbQyhbAkMfKBIF9/pEZjlWiFUsehgwXjSYZLyzZQAy+aEzYfwDNuCwf8NWEU7Ik2sAuOTbmT6RypV5khGX2LYcaqz7bixeER/DFQZ8NhUYnhNjhhK3RtDcSEBtlhIFjLQljVIK1oE+hIUi6An6mCN+Q2+kTREagZkMB0p2Q3NkdGIO1GgK1udmKYi0EfASRFIAWCCnaiPmgHINtE7ALCAAVrUQlk7DpaWte1g87BmmeCACAOzYM9ueu2VTZQCtzthwyAlFRdqW72gfhYCs1KGLwlO7nDYmJjyYNJZUZC7Z89mP90MdGXNIbgMKU95MAIPvT5f/3fR106vjQk7FL79qwtBQgyD35XwNSf1o6+xdf/MiuV1+akhYHNQerqt1gftlkYNen728XA5Azf8VLX5lvGA3pmHTxTZ0Hp4UF19buXLLzww+LyrhRCmHLCJ2UAFj4aMQIagGiIs2Sddx0+JMJ+YaRxQDzb2KhNr6GJqQPsq9qzEDsUdlcWU3mL/8U4E8ZWYnqlF5IOUex+aHtfrSeMyHPakHND8CzEkKsYaHsSYcygvxCUMHjdbYVNCIOPWUQZJdcCQJlAbUxjgtpHetVvlALKAc0dCDyVMU5YjdwWko1BQTVpFgXg2hayogPoi71MrGdRyF4m41wOiSHaAIQnjLlnSH9wwGg10uf9KrfueufT+cUeRF3K5AAUNKr3Xkjgrd+uHFtXkNEp/YXj+vQ9Y9ta99Zldu305RLye8vZ++s99YU1mlFbp18ydUpwcu2z15RGz0o/ZLzrPLte994snDo9f3QW+dDh17Zo78v99MXC8sTkydf2X3yzhUf8C+cN0Ri04ivIBPxFG5iD12weRCV3lTCXKxZIZztgnnrDPBqkkFQhn2qqkwchVYCHzsljFx2G5D0Inu7spVMVhOixBdUhRD+JK89a0VlbRIaF45ZOoCvBnCLR9YpQ1SV1pQZH2g0TFTHCoUzk1TFMxvdUCon5IyikBImYvgDKZPVkfOedTORiIMqki1CF4sbwYUAhJxtvI/apNKv71z85W5Fy9qD3z23ZuuEfpe03j/rk5KG2loTBE2ObOYoAARHh7aqrd65piSrnMC2bf/P3reHV1Vcfa9JcgKcQEgI5RrQgBAUEFARRSlaKMUi1kurYr1gi+2LveBbbD+rj5/09a3Yql+lrdgqKlrUagWt1EpVUJQCEeQiQUgQgiRcEggJuRxITpL5/th7z16zZmZfzjkBpKyHJ+yz98yaNWvW/OY3s2fvXbaq7WgjQGOsrHcTtEYOf15fIX3bQzFxQHZfqP77K5U7GgF27B508bn2psXG5gM7oO4YShzpUnBm62fPlX2yuQ2gYdXo3l8flAXv1SLF9kwTzXnEjR0JDeXhz2ieGNFTJ2byxsA1W6UPJoO0fdKE4moEmWKKwK6aBafUVlGb2EPU8diQijtpJJOZQFFEEcWuTBDPOQjmqfA7AA0jVf2AjfTmxV6U00FAhmqioiclhoqR6jG5ew4gEUBQCjpxosdBdWiXA1A7+AYS3GTNHz/5YZn0PmpDprbqXQ1dGtp4ZtPezxvitL3t7R2MMc4hvmV/Uf3wW/7fRd/c11jxRe2ny/durvO9s+FKRpfMTvXHqi2sZK1Hm0DdvG1LZiTaMV5R3WZbWN0S7ZIZAYjbvM+ykYutM/gMd7ghk11H+qx2IAfF+0mIDMsy75O2UoPc7DiIxV8tDfQQtbMJgmAiktrx14R0TPnbPoIxU6whcA5OFDhWM5ld0xujQp+z1kboGJ0eKu9KxJ1WMEo8JyVDC+juXbq3wzGPA91dV+bSZrJhUBxTtoimfrRFTjAiBuGDQjAfFD8TqYCdob68vt796duxJdakAwkGwOtq/v7LVR+dkzvozM75w3vfcm+XyC8+W1+rV8fknyS0fIQ+gY4pnvjLuHy3xCEQDF8VOZwjf5adGlYosx682G+BIAPGmQ4KQfa/oY/o25UrJ1VU1RIcMgqTolVQCMsBExLcJZgzKDsXMLWTTnGzof6KAAAgAElEQVRAMMFkZ+EBHojDMUMnbysg46dD2RgOTCcFE1oc61yfc2I5WiBQsVt2rjqBxXWkOKHlnCdM0rzLF/5hmnMgX0kEDVngbEasbG2DiN3KHDhjad16pVcXV69d+sVrvyv7LJJ9Zl8AAGhui6fL4NXcFgeIRAAAwLkUb2g+Go1Eg9h0LB47ltEtz9KYlpcTidU3xx0DufRXstr5bLAARK7koBUloGgcU5MRsdhv8wmOl11p2R4DF7GJy82smo7DS/hAJYBa/WRcJnmDx1YqBEM3kytNdrZy4GA/iicGHsS8QAYU2yfcPQbnDMMLjuBMPBApkA7EszdiT6+DZWK1zoNiaJscz5RNN5Xcv6SRTjDwEbG/XxxEDPgnapUCjqK2gxB5PHKlvjYOPfMuGJH39Vt69ctkGWOHzPrlkMtHd8kf1HXEN3uemd5cXQvAAA4cOxzJOe9rXfNH9r197vDLBwEcilUei545vAMAdBrUfVC3NGAAO+v2pncbc3nHjHSI9OncK2oVkpZ9ZjR/UDS7I0RysvIHRXt+JQ3i9WXlGed884wR53QZNH7gpUNadn/eKEZtVBGG3vvDnTkymaKoUMhQ/Gp8ovKzZEUe6KxBRdoJDLoIMEEymbdyJaVIQFge4VeghBX56YGSx11wncQZ0DkJrY2g0UaCNmafIdqtNmAi0MTeNeE+3GTMTQ8O1xNQLe3yk4mefZJL7qY7ibTd0UMwpJ5cIAjS+2aCZXA86XbslMzR1I6glqu1sfrf5Z9cUnjjz79yZPf+qq4HKtaVvT1i6BU/vuBbkdZj1bHSJTuK9jEADgf3v/P2V275zqi7Iy3Vm8re/QKgufrdJbW33zDm8TvSWhqb46ytAgBqK//+Uu7N377w0elp8aPxlnTYDQDpHcfdeeHX8wEA4Mzhd0+E6n998uDz9UWLdhT8sOCWe8/IaD62e9WOf65tU4JR6uNWReXpOKk3VxR4OSSVQxC2iTwgReqghUIV17iSBuSU6lUTFIJciqrHw8LjyDxw66stwuzxz50h+redBXzuXJWjGTZKxLl9N45s6nH/4kBDPVje+wMArn6CcVJInHQolrywnj2HZmf3Bc/26NF7SNX+7ep5ZcxOQa9Ux3sOwKLZCakRlIrTi4SVpEh4rC5AjKhzS9LdAZulDT2VXaVE5AaV52LeFFTbbOJA62QTWnFdWYQ2epjuYWQqJKAhau1tHOQ2xJA0TmbDrkXNJfM4IGGlc0lajjSZrrxNjmEUPmWloW4fer4Y/QsoTrhy3fCWoOOEAfggITXgDMxKF8TMBReQirbmxlJx8TiCCUgQfLRikAmFRK1nQaHFdQAXzIU5F3APQWVjnFb/ivRM8bPqJvwT80oVe1RfMMNxqsVXN66lMqxpPnmmaT7tjjzGzB6X7XLnyAiBCQi6T8spL2gRT865M/RQDk1hPB4/0b93O1S9LYbNaJsm5Q7cU5LQwcCNGgY4DBkqA/9MugsFU0AcRfgPHo9cxxIoSCl6K5YxBtbtY3XGRIxgqJ240nLqGbWKgFLik+QMQToVFo+jMFQ/UwJ8wJUrSnZuoxUVAvZmVNLvZ1bx0SrIuSo1rvykR4LypWSOaQAKAQMbMKS75GrtpKZmAMCcN5aIG1cscW+6JSQZ5I49duDJjzu7tzDskkwUI3BZ4BOtyChajIntuBNkgTlMvZxSsZqTu6wBR4OMaKCAF2Z/KuHBnMaEJWTaidOfaLahzndURktoYDCTkRPd4VvLlsmB/FCKZgHRwzTrkHDULyWQJSmG/YNOIFo+qdy3nTH08gXVmQQTOXew0d2NQbMEExsKY3XST9eIcJRA7ZJeiblLINXx0i07ZI08rVM5D/6dspI8bGC4WgzsZwFVjoZ/kqbAl4RgBqfm4n5ZVFQlKY+LcNledbTTdhEI3Wyqm7BufFWccCCXqY4WiVT/ikNGD/7DxNk3Q8Z23QjhEnomMxNVmKSUCXbJlI5kKFGrD4+u8usWVaVJia3RAR461qIRwk6dmpK1sWsfODV1/UBSpEjo3X+bXehohPuTYBmxTHtAiA5DSrQOADkL/nkcGaIKRR4pcYWSKM3Uwh7qTa5PLFhONAM/LuK8jzpYaoE9zg+PhCBRcYKkIEcKUcjkY4N256+LV3L+xIWYxtBbtV0hvTdlgKQijcYpzLBWkaSI9wNY6+fuxlwXhw0USOsHwvK40tZqYpVQiZ+mgk4cg/EuGVcosI1hQYcpERK2IF+gZqghT1mR7henVJjyD4BQSycVI/ksEdMCBnJy+yK4CTmTosGDqSZSB7c45/WBXiDE5ONErFARFyQqjH6nEoFRU1jI7xQsBjNUFCF0oDBVQM3nQdm1g5c6gdNmPEEdUzscqGlU+kvqBJqfxw3UA9EZOfGJG3DaXzTvYSUTHVXIKM58ApIO5QgKM6ddOPYbB9dOLzumyYdhDR107nPuPwY2/PijXcXuSS2LQMe5F137/VsvPqtHNBNaaitK3n9h4dINMQDoMmzy7TMnDMk9unvFK08v2FrjpO897Z4Hxmz937uWVli/cwqvvvOGrw7r1TUzXl+5a81fF77yUR22U5oM9hj6nZk3jC/sdKR4+V/mLyupBQbZI26d/p0JA3tkZbQ21u3d8t6iJ5fvbtR6LTpk2vSbvja4d04E4rHKkjVLnlyyoQq6jJo649axg/OzO0C8tqL43QUL397a4uv45AR/UUC8kc69rMVq/NOj03uAN25rj37XvlX3kSBzAIIcqr2m5QSi5FTmYCeTaPbNhJrqkTmbOoVDfEAzjnp0FumCco0hK51wsZ7WVNVkFl556/jsktf/cN/Dc+Y89a+K3lNundAfAHJG3/rzK7ptffWJJ9fBuOl3XJVnJY8WjJ5yab90pGDgt2+e3Lf8rd8/+uB9818pjo6/7doREb0XAPImzZp+aea65x959bOcCTPvHN0VIG3UVbdMjm5//omH7n34/y1Y3TT8qqljMrT8KL1gwo1Te+1/8+mH75v70CNLduaM/+51g9N5t8unTeh3cOWffzX3wTkL/x0r/Na3x3axO0gQbpKAoEkxQz42lEN4P+avZMwU6XFe0tcxi/SQE8pOVNO4jGjaxUziAH2XQGlOg+Bxkwx1NmOJROEA8vLOuO+c/POzOmS2Hvvki20Pldbsg6yfXDr64oYDDTm9hme2llV9PmfL/tJWyMs9476h+ed3zsxsa95dtfuh4r1bWliH7L5zhp85tksmtDRu2b39gc/r6nMGvnRR/74MIG/s6iEAxypmf1C6hgPvkDf73LMm52Z1TotX1xz885btS2MAGdk/HH72dV+JduHNJTHoAA2OcZG87z0zZlxsx4M/2bErbr8xhTNwvjzJGOM8ktc999DmZau3lgAA7M0smTSrV48ItFwxcXjNyt88va4sDpU9Bv/PNyYMfvvV3RdN/+2sUc21MYgLV0TPzO9aWbT8g7XlrQC7K9eMG3dxQT5sLtO4M23YhMsLDvzrF0vXV8CGWK/CByZ8tWBd0ZB+nctWL11RegSAl5Y//snyjHgLyN3COk7vkZfbWPq3ZVt3xgGgonX4xDEFvaMsFqsoXr5i2aZiAF5R+dHYr3+jay6DemnlINXdhuEjjv/XirpgR7AMm0jmv9rBEK8tahH4hIIEnuuLMyDbq9rOzIDoUYpOUrscclqCPV/M0nN/em5B70MlD3zaUN+p50+GnfPDmjUPHASAtIJuGX9Yt+rHTV1mjxn2w14HZ+/rePvwgjPqdszZeqQ+vct1Zxfe3b96+i64aehZw4/u/sOuGER7Ths45Kaqj/9QX37fv6snDR9x8eEtc/ceAx4v4wCQdvngs6/KrP7Dhs92t2QOLyi8++yeqz+p7FNw9k1dGxdu/OxT3vnbZxcW4vlZWxyamxjEAYChKTfauti4+nfTVoOz66Vrfl60cX8dRAsLe1UX/3VPHADgUNHWvdeNOicfSjcs+fWPXj06ZsbDX3N9xCLA43H7Ddjx5laIdnBfmyhJz+EDcivWfVwBANC2q/izmolDCqNbIhlpPb763wuu7JWTGa85sH3ZX59dXEY8bv2MFy2cVSTORXv3yG5qPNIEFe/9foF9Litv5LBeENtaD4C2WMsrBykQBEdc7JPnFKUU+0EBBmZIhoVMEYMsWKmaT5CogMTl81pCrKYPfl7RelpSIBlOczHG3R5FJLNL3vBIzUvb96+MAz9S/5PaL5qP2e8f3VfxxWv1Lc1Q84d1RXCsBTrmDu9U/491ez84CgAN9fvyn8rp2hmq15d9tqX24PpjAOzoGX3OL+jMoK65pB7Ob4Hm5tiW+qN2SSzr/JyMTz4vWXyoDQC2lFVdeV634aymT26nfRXFzx1sBKjf/0XPsf2FafFDC7//z4Xip2aclJ7mTM8fe/NVAyrefnVnPG94DtSsrR404/4fX1T+7N2ba+LZubkAZXX7G6GL9KGq2KGqWPdhI/tnLdvTmNFz3Ki+mVABAJGRP1xwx4UOILZVrnzsrlfTcrrGq6pbxkx/dFa/dY/MqzoI5/TIS8sEyIIvXljwl7LmzoMn3jTt5is2PLikLHr5nLm3DBMLtOVLf/7wG4hj5oy7/urz6tY8VNxsM9+ht8+/89IcAKj+8KF/14Ba0xQyJIeoMUBzZB2DRUJ6vGl5hXninarkZKU+ZEwQqMfReY+RSTDK03IySAYAoJugnAHaKiyaMbNDl+aj+1rscw3H4uCs0O2PHbVe3tzQ1AwMMjMjXVj2Dy+7/IeihNrM7tDKOvacffGQPh0yOjDgAJ9Y/csS6XmgzC4d0saOvGz1SEF1qrunR/IyofroUetMfdyLuaJjHIccACA6/IofzJrce/srjy3d3wb9AACgpaasbGfOgZq4YokrLVvfXL7zvqlznp8KAK3NsTgcBQCIFy+e8/C/Mu1Erc1HDsTB+nxJvLa8tLRlfy2IRca2sjVLl5UcAoCSZYMm3F1QGIWy2PoFj+6OCsCI11QIn2f0n3z7zFsHVL82f0lxi3O95I2HHv4wJ//S2244d1xh5oatzaKSNloJFyTfuzCIMfe7evilrAHyg9IgoIM/bWJA0HJyi2mFE3TjhplRn5YTKYKOuC3F8F5aewuttdam1dAmvewnDYDXLFy7Y7X4jlJb075Ij7mDu+7fUfxYdVMzZF036pw8UR6jz96xtvjqrZsW1oiX6bfubUn/LoPmNtvKYEK7a0b+5Ok/uq2wfvnTDz9TXMMBoPpwLZyXn3dowaLfLQfIn5ibWbf/iF5ZvOy93834oGt+966ReE3N4O/PnwhxAGg5VFZ+SE5ZU3skUpAXLVn+1ByASMENX4HGT6rbcgHisZidJBZrhg7RTgCxhoryBtXqSN7oGXfeNg42LHh00Ypq9DWVlsNl5Yeh/FD+6IsnDOjBttqwycF5gRxZUkuFcJBemg1yj/YrhBA6dVHtVBHCllX4Iy475RzwpRf7eRJnXU0T3AyAxZvrMzv1ce4td+kQyXQuATpgDJqa4w0QyWxt3NLQuKWhsSQe3xdrae7QMY81flJR80l9bEtDUz3YD4Mw1tbcBplpaeAu5zXXtaR3gaYt9Y1b6hu3HI1XHz12GOLVTZDXMVOySS9kccZJ3eOKH/zstt6lT859eMHWGuuDmXC0pORA92Gj+mcyBtD9vBH5Nbu2lmsLiAycPPUbozKPVBzYU1Zd37lrFrQcbdSXX7VlV03+yPPyAQDSBwwbmntgW3GsJd4C0Wz7la6RaDQLmmJHtdkZZF8wc9b3hh1YfN/c51ZUxy3vRwq+89v7bxmTYRnVGgfOIY3jeRVhTqnjGtLjJbLakIVgMkjIUpCMJ7HglvBY2yRtFHAV9LQcH3H3DzJ7bqWBwuaGmuKW/OuG9Nq3p7E5q+cPhvbcv3nNA4fsXFjYsSNbjg36RmH/LZ/XNGR2mz60f2bZuh/uPdbAs8b2yys91JSZkz82ypq65J6Zfnh3a3xfY3Ofr/S6rKqqQ5+zpmXsmb21pri27aozB90U27OltdOkQYXfiO+YtvHAltqjP+jd5+K9u9bEI8NzOgLUOx0qknvrn8Zc2rjroZ+W7gYl2KzjyNAp1xXWLHvq/cqs/oVRAGiNH60qq97/9ntbJt9wy60HFpf2uvK63mWLF+6IA4Noj8K87rlRFunau7BfW+WBfbXQpXDs1RM61cbXVMWzz5x6Sb9YyeuVene2Fi9/v+yXU2Zedei1/UOmje9c/MqHZRDrub9p6uirJ5e9V9bcdegVF+UeWFUS02ZPGzzx6oviRU++tzvS+8zBAACtseryiroG6D528sStjVtroNeYrw3kB9ccclrMJuLoR8CWDyCOHxmn1C5wfm2+IBNe7Y2Gk1I8FkLxVUBNw5VkJz3an+LCevUamtM13/lptyaXfwLwPt0H/vLsPsOzIpktxz7Zve2Bz2uqIesnl4wu3P3hj/dKH4TLyztjztn9h3fO6NDaXLL/84e2VZa2pg0745x7B3Y/swNrbo6tP9h4Zo/c0s0f/fIgQKeevzpv8PjsDDhat7R486MH46xT3s/OLZyc07Ezi+87vP/PWz5/5xhARvYPRpz97bysLqytvgW6NO35wUe7tgAARPK+/+zYSxu3P/iT0l1x0EvO+F88fX0hPhNb98cZCzc2Q+fhk2+fOWFo7tFdy6191Bxyxv9iwQ0iccXSub96vhzyR99y51UXFORFI/H6ql2rXlj4t7WGKTQA9Bx6409vvHRAp9ot7y2av2x7LQDkXTDj5uvGDeiRFWmq3b/17UULFpc16bJGxt0xb9bIDsj5rVsWzfrVmvRRU2fc9tUh+dEIbzlSseWtJxcuL22RbhQDeiTOPpWqriWvCZI7IAkVcopODrmC/GpFPW4gnYbCEyUNdfsIDrrC6aFX0IdqQqUD0RNePcxwLYABhJkE7cbqW2dOjHC//uQYl1obddrU5a/TIolKgkm0BSHvp3nicRP7fdTagZk5a/CmdUMlcVBRpjviBFN/S2q5nEMu2M8AvFZPVHgqkD+4aa+kGr7PpZaXMsFdistWc/rJ9RSuPSne0YLgKUftEhIy+SULoSbHmRqLnwbB4yhp4hYHFetWBogXD2pXP5IS3fqP55oQCRk0YhIo9TSOYLp20YYWAihkrf3YbigbCmuvICZOwO/dZCzJF996FGig4P+JrMVUW+95LpPPk3HttJxYsfYPAqD+rNwwZnYSztzuj3kVOif6RcCmJSQNndP85upZ3coVo0m1wlVEkW3xosDM+XSH9SZg8nEbfRZDx0i2D6jfFbPqRt4ZmzoJsYvwlBbfBT4mc3d13DgNfyePaN5HLeGOzL/wK5GdRy4YgOaBK4GJATsjUuADQ9IFlR4KU7ltjk6Rgp1Usc86gFCh0i/3fcCyAnX5HF/3L89X0OthGQDnPAU6Ue91OrDYSaNWMiUFntSi3vfAl0wYp13O8R9sT8txFP13miwxzDFd/LOAjoKR+McBlC9TazVideC+V5WunASb9kqpGfOOs9RP9rEaOpDISYirUmGBO8e3dsMnXx+EgNrT0F4+PCkFNxZxS5DoFhDpsxZzWo67pDEVb5AI3GGa0wDOV5mcv0oqhtKpGslJjnS5swovw9pHmPI3oTKdl7bax7rbiICmTsgHCQsG4JRxDdN9JeeXBxM6NUWEpoprIgEYWvnU986XUzTfLzaJkkCDFz4aKFIaiIXds7yH2KB4wRyENs1kFTH154RiGEEE/RQwk5LIaZMT+4Fx68ZJskOGOhSgRlPvhZ7KfBAL03gDQF4TPC1fFtG/h9UXEJGQQZE5JNEru8/01u7F9sN2jBnTsgDWYqPF93jdT0cpaQLbGzjUteSXuaxNW1jSotOUhHYzOjO5Sqc4CHiyY+kMTplMs57K3jxpJMD6oK4ddKzQi+p5aPAGH4fOkPX4hMSBQlc4Wrtk4qepRlzp8wnaYCtTTuLZFkmeqHAAVMckqCaTbcP3w5QZ/6k8+QvSIj6x7VzyGMWDaDgtKZQ0PVVxfkq3OOQ2Yca2lBhBEDT0bWx5fqdnHKGHXBdqnV9Sfu2yj3rDMGANDKXLzicAnFwfwPYzQYS9bnkGEISG+BWNKrr/J/ZfMoxhZ6sjHNedxFcZSnZa2lvQ94tx51NAhTGUjMnJnJQOlCQCUqaBEQl30dA8XCbZ/9AXiu3SHHCUaSS9nc29bApaNsrsfjEzGciSupL4eIv0pe+QGhGKivvRXHaIRzOGHqpOTjFhk7Z6JhRjcgupV5OEv1PB0cdR3PfyW8LlY1vShl3/8Jzxec7P2Nqnf/boxtZh18+dM767dHJTPDLqhwvuGGO/ZApaqz547K5XtzfjUhJtYDu3BYX2fE+3OzGZGZqghJgbOuU4RXNSCAlaMq8NZgIJW3z7gUl79kKK6wb7RQxak8Oo47J7ddap2hmqEkN/v6zijTLqqKitrUf9E3YNk2PntHiK2ztYn95Dc3M071kQwgEAItn5A7qKPddttdV7KmMQyc4vyM5w1LXWVJdXxQAy8gp6d4nYGVvjdQd2HYlr+oh3O3l2FDvM6EMrutTtEQ3oraccfc5Ai2TJIb/QFMxpnpndvxxfTI1dWo1kXgg6BPxyo6GWNKAR4sTU7cvt0+Mnrp8a6vYFxEEf8QM1pxtwjjuF76MmntdFbrndlTztGpHcNYRAntrbE7WCYAgk8LycJxqqqYJZ5FcWyJhgugRf9p7r3cxMl7Jd5cvtzeMqtqsa6vanBV+580jms64ngl5MEhj+399Y7WnNzm2slLknIEAVEhRur7vplhFRIsm+kGKoUaLCOKGE4l8CupQD+RyeQ4sz2HyGTn6JVw9JDQG1WHIODm3GaRD0FLkjucLTnOvMeZTDX43pkgmwhH6qw6+8AN2Cax6c0y7POH9T29XEfVjnbQukF+DiU7Fug4AlzP5oaobdFhh/EsJnwvSAqlGXBUgqstjIzaacXBCJoQ1DHsjQDkk5OEGrToss6mDNUSvZkub0J25xGzsHzsskVQo7oWWa25trn/dlDrXTKtUxDnqdFqoFQXBrndq4xFuLnDva3IEZG/vkR1qIlaEKSwAEhXBHhz0yuZHAUZIAmnEM4Kwg+di7V5oukXU2UNrqpABEDaNw/nKdU025UmLJSeGRk0u0EQrmY5YhL65xQB0br+aRod1FGN0yn0oDcCbnqqyLJOT0hJ9asF6FZXzjFy6F22a30yTCfgwG0QKu+Rbq8R+5pcjg5Bzgi+GUqqyQS0qJqFNjtWzMrgAdm7BVWHFcvUpqjU+CTBi5fCmFBpwmgI4wxd+guMfkMJ7mcjyXmEmskFIt0pg8EW4ifwrS1cNAIYZyieZWt7tBIFtQvTR1TKUw4JxzjtcENGuaCWtn7r9g4k7dVP9LmOjB+RWNGA4MHZ5MjVW8Ez9BBjt1hZEcmEppd9HaROpmialTQgAHeyTwhdf/MJ6ozmW0rJ0MXja+pCnZ8CqHQR+T/xk87sHYmRQwUhmcGCwfm3W6tXLnfb6R4FjBIbGZZgCxd2OLd0Vz2zpp/ElKOP6Eu581Vg5plZDkFWw1MNkgs2oEYwQTuA4lVAuZ8hNPOnEcB0br1IkW1EgXJPVMxj7vlQXmmeY/gCpqx0XVMepPwhmZ9TyJoBRKJDtaZNzTIKOJlej6OkeXKDFhojxNDgd2vSJL9HDv9Sm3Jvb7Dj3ncokKNYAxxjm3gBEsWNRQ95Di8GjzwKVkcMzTtJtosGBzORWWUCbt+KydquBVNc1IbM5OsmgzBqlBoFwqncAqQOez9gOjwOPUKSAEdcRPLgerGlpabsflgGVA3kctpm9o6U5d5XDL1/B8fB/E2EqkVpp0zMEzKSHSbA4CYZ1AQ/OiIcrk+thhiKkQTdfCjwZa27AZsxYQcTOHKJ+iWNBMwTwTwBDckH5wQtKquKEmEIFOsngv/YTyoYdajfUeKbChQdInE2b/MSBoCUYdAj+m0SeIh+y20r9vxuGGIIOoRDjU6TjIGUh4K4ldW7U7AY09yiEsdqhpsJIMF9LynL84BTNHeXtNmQHcKar90C93Nt8kV2QwKgd6Eidfw/88deLYDFABXxamRRIyWmiJF0ddJaAbPdTSdDgpYbBclzjpttRI8IqpGU9K8bbLhH1qbODZFTPHGKaQ9oHxvVsOFOLG5SSB98DolugkFciCk3iLV0jiGR0ZgqXcNusJFQTidlGqQZD4031aGmx6mNT83LY6AGzhKAlUV8zPzOpSLWQwJqRAgB1Ba0BpVOu0lmJMMw4jRDso8yvSTUlPTV4IBCeW9yQT40DsCIY80gIeTYl/ar0llZtm9o54YCPBdtTzi1S1B4pzzZMl7g+Jbwa6eYKF011B7fd2Z+els0xOlLS3gg43CI9V4TrDDYpMaybhxaNU3I6EEWjtw+cJenpkYSS/yQgyISfWpFwSU9t+9hiEjEymNB7DFRn8cBqPKMNtotIBvQ/S3NMGm5VzEqPzraVGCyOskBkK8itFvsABzZGlWnEngXVnNUwwON8YkfZU+lOthEXMkUFu73BCPRZMgcOaDanVOZ6SUI3opJ2kxThciNYmtZVJ3/DgfaTPaKBQNZEwQaEo5KjrL8cXyJIU7WqBVjxGE1CWItQwEFlUf5NZDJlNuxrQ88Xc1HncbWqKWW753lUktknf/JULMmvyEYp+CgaLvZGhWaEWBB0qav9NTbxbpIxz3BjhNdPQI5NLfQ7utK4ucEmMGQZjE8VKAhGIDlDDz9AfAP01QadWoTqrolpUyCPnMRh/qZALi8dA5t2e/uRLEQxtASFPu2AChvNqX6K1S7N+Wjin9nO3ygzAvuGg6wGeQh1GnqLj4GBwqsNG11jc7uo8NBqCi93MGRzAwccUGi6WI6Q5cvjHiTWn9Ea6uOAMEgEK4GosUaX4b0LuMXVCUogWztS8KhHgfgaqKCxdU93g5eYTIea29G5lUTOTV9XZAaBLEHjgwxJl4QsAACAASURBVGsUpGmwJcQAdZzFRav6/RtEuk8i4EkwKN1Ip1fqMUZ4WSE6IHdPaHciBvSrPmBBWO7DbUOJ6xXhN09oCCXMur1jQy1qyzCkmUn/OcfUSGnk5KFur+uSaAfx0INnaPHmdEzuctgL2jNErQ2UzsAnlaiNIbWPHn/x9Ll2TUDNR6CeeFKkAcV7XElGisAHamI1Y5BxDpeu2uYl+u/VUQ0KWnngXnAIk89zB0iYA1ihhZnGKWG/W5bR2lDFSeq4uxk7JTNlZ3HS2luI+mAwRNGEAMEKg4XO1NizGFx5pbIBmjslosa9limYOgMZ51VuqM6JGDiNLJZTmf1TEtFkHnjT3uIEo3cSkgDDnHberzqHy57EnlDnszgLKN42sXLc0MI2YolaaIAwdsRr34wMUvZZRNb0doca9gWCoKc6bOu9JyomMXY2KR5tn7IgG4kDCAO7Q4jlhaR4pkY3cOvzLO7p5NSTOHfPKs99BxF5OGe6yOCJz45D2QHmwrVCIFILoJIqB+DceHKO3CwOAvIEdymkUny7EaZOakyoMK4OPITEEVpHqBnozmj8jODVBHMmYXLzBfK813c7kQ4BfRxsUmgc5zyK1Y7I7n8cUwsjowoSUxSG8PDjtpTV7S2dIVymFSlSLNLGQzWEj2bRtcBZN9RtF9JISOhxoRA/YuOfSe4d2g7RnoJZDFBrfEJG2y1NA5mbhiFKCM5D3vivUM7RI+DtL0E8baodpnhBDDYNPCCjqkr9COByOV6Yrsm4bJ72IHHxwUFQHcY52ukWgvcYjUUkB2Gg172HICOC/jcZ2BgDtLiXQr5i6bW1J/RKHlkZd44YiAf/LA/5meyFAfoLLgiiVVQ/6/AMUs6jqmgfTCRtzOWIU6vgwVNwGjq3QnMIez7B3ekMkKFJrvXxoYQmgkJQBicTZ5guiwpnIHsbO5B4TM2CWwcX5DEpFunVbpz8OGsX6rGPWmuVPS1m7sRVY71Jp/cIaytl7i9mwA/v8d3XDAC561IETGW8clBAMBH1TD6SJ2eh8qsX9Neknu+vXUE7hjoEGevbX7hcvrZYlW6I86ZgIO627ikBQkMrkSCJVn6GuHx7+0CMXirKi58qESOsiiQI4kAPHqcmAyVcyHzNVBBXmiN54mIrTPPVZCBxXl/kCMXjpJP26lqyDApr9oFSwbTc+WAqxW15sbAagkNrhbtLtOpLfsyajVf0bnL7tvuZrSCAKP9SASklwSuLdlIGhm5pEpKSAJbHmOOioXbAkCfFBGhSDohkVg7mPicqqKXMKg0E+appwovTqMckF5PNUMZSmoUAYvDG9Zc0X336q5w771imLgjbzal+tDGP62+WhFPub481Wts8F985Sf247e7QI0NjUFGHREeJn56g7cLE/6Jj43APUIykRFWcWrcmO6roRMsBXReT22vOYoW0CIjuJqv4SHBBeylIpUxptEpUtMKjhUqBCTCR1mdoFkyChIh2UoyvqlBIjFRxJvUd0399UCeEr1GzEkAvSYUDf97V9XWGR7jRROhdWOAgVTuN28wZtTURGCi3OHLy47g1z72MQwIelak93N7R7Q6/fuYqoR6oLROX9tKr6JcwTkCboMxMXiJkzo0U3U0SAg1ajCCgozVM2xbBuwUuH9MhQgOZfBWTQRUWPWqhorCWHXtgt5a6ekvQlC4OhgkoJu6WhCrMowiNCj8yGLBUX8IrqXPekCovTfKAOkKIKbYDi5iOSXk9Nfgk0QSkAEGQ/e1XDOogYnms3SGrfUWMXxxvixHYRyCPSxkZSORay7NU9PHu9nhu6M37wOeqvDIla2MGJAKdwWRA5rrsXMnC0CWuuAV0tQseSUFTpgVJ6eU5ZSEvMRInnXd37HspCwpwfqEhWeB8vUmekqtAkKxIUENG1qAa7L6HtqehzAZjTUs+sk1Yg93nFTV+huo6VFIPkKdewjao6yDNB3bQmIRe5yG2fwmIJMGoDS2meFjXxF4TxiDxZIJXcOvhjIU6iofPYwhTMR0PsFp8VyGPKaVoQT9lkpZQ73ZaVvxF4q0vRGlM9ym88BKOiDj3MqyvithbX2w+A6lqA9zCkpU4lnyK4oDJoNQlZGCU9QTFW6WPK9sJgzUNGr+1MHBCJZHWdPxqBEHnWHqvOVpYcMuVGSLGCJUhcrmJhYiUmIuBHPUqgqjjpdwsrhp1jiDCVIUzbYTgclW4FweqEpysHbBPVhmIDyJxzGWMA5j2tSQgCpo6AeRXhG+nEmES1lbn8V7OeSprSmwzlR0wq7x+B1JIqT0iuHqQIh/5MCRxRX5PxVbKEy/ermPSA3bWPBqc5y3tMcFyI3NuNCtTQmYACFSIJgEGTcIZ8T+mJFbzCpNxAKlvoyLwqsUvop8pNhCqeLyE+JUFuE8itwMmLTZCBC/dI4Y0Wji3i0hawhAYKwMDC4LtZVCONkumvrUYoFgizMBPOCjx6qjEidQSg0Kh09ooC5mIBXOI0w3b53tYJ1JMVE2+4e6+qwklZk7zaZELFFfjNPi8mp0IYrHuHWyCvCgjU0IQv1tA/xYUjzMmPqjN2P6zBdLXAIALHGTBy3dNZ/bU1T3jN1rqRdN07s44TCc0GYNIuLkYJ83P7U9vutv/wDEsNd1ZYxuX28nMG2WCxuUDLzODmq5BVNxJcF/y08MAnGbk+vb8EohHjxdsh0xKwX7yxCXUCH4EADG5qbTeIfCkkkFcMmGXzGZ5gpvSyEDKOTKJ7J7ysA6ApqSx51tBj/MmCYmbohPLoJAmrvnEZWTSBQueOacwApFJFyx4tnBQxP2YBlpjYB2vHHvfW1+7ZKCVp9s3/zLlmsvSNOVqbBPS5bI/XTVtSppNNgUL0ROJIG4Lh1h0ZzIDlxA6nmI4npMSpjUPtxagbqLJjY8MTFLpl14qtXlFD5bKAqQjkCvwHnk8l/iSYqIQ4QIEOfYZsA/cPgL2jX6Bf/gtcLqRTANthkIoApGxCsB6/sFOqGYHqVlxw2JzTD2Z4DDWio0K19a+ccU8funpptpOIfYPdsvtmF4Tq45bB03VcXXGKtR2Pe/Kbhn0kkmM+GjhrNiMBcbuEsSxwUiLURAZdJ54ScWEXSpCi4bhQsdgEoEs51cgmqwLM8EowlJt0pL20KaSki+nYJcqVM1+hRqm8I4PxK1kpvurngRHsQelUoZQZp93qItMMgiGaoc2j7k4TkBcgGvgzYaMdQkpxEnaBAq4u3Cl7dfuuW49O7Q2NB0BOKtnh+bDsXrQ3s+1bcgeO+icF4o+bRDnI2fcOmrylJ7dO6fHDx/Z8fonby050nrZBXf/vGdLQ3rHzmnxw4e3/XX9W2818ssumH13v44AbOa37p8JbRXbF/zXZ5WRPte9Mqz+oXfeWQ8c0of9aspllSvnz4+d99iVE3o0NneOZmW2xcrL3/v1hk/LIa1fv2/OOvvss7Mym5trd36x/JHi7ZXCsCShC31PznQvW0fHQhXhMU0Gn2ooD8N4EkPvErU2gNNHOIB7P5ShwMdJzZpkF0qLzB69++QVDs5KH3YmaivmVEugoTusOlkwZhAgcUuRDwD0nZ5rzounRrmTkYPdnJiqAqORpo0PDgBcfiGpOZLISWZSG6DttfFPVJEGIOkNJWRIyQw16fuLJeedmwkAFzz3D+vMhU/N2TDzgb1HaQYOAG2V+3ZBz/MnZX36un02bUThldfkVP71439ub+4wcMDXbx45et3KtQDQdGT1A0VFO1tzJ426+fsjRqxfvWFd8fN377vw5xd0/2DVsnVxiB87hG0TcyqnuLSaL/720x374lkX3vvViTeWFz9SO3LmiLPZ7n89UH4YsgbfOOqKWw9+/khlixtlyUMhqEpcWExKvRHD1L5grAmOMoxQ3NUj/zKFukax0wKID6rw7A9jeDpsLS9zbxcm32ztKxbAMDzlIg3l1NjaniomF0zbWgZ0M42BWn+pYjkatZHkVUYDhygmZxg4r6xTDDGhEjmjaVBz5JARQc0kzDMBIjecdC6l4WGIGCd+HXzu3qL3K1t3LVn1f+9e/35l644lq+YsqDpKMzg/mus3/uNwj0kF/TPtWXf2kG5dyne998qB8s2HP1/y2aflnfPPTgOA1sa6fTub2+Kt1e988Xljt/4DgTUeq9pe3xCHpsO1ldvrDnze3CI7zg4ku6S2ms37Kmpa2xrqSrfXd+jVJRrp1m9ga8mS4k/XH6lYv+/Df1SmDenWIyJqnQzbEJNhTibFogcnvcrFDBMOrTUmDXKzmwlkQsYy6ZB59hUvoUMvgVBycFKDoCtMNpxrQo6BXGP5r/glDhj6p/IcNQ3IGpwE0vs43AcyNQBhIp2igdSTREyNRTSQJibRyJQEgBxK1OocbRRSnKMtw6JZ9jVOs1gnmg/uhEjnlvLtNbt29rgiK77v05rd5SQDPuJH3t+x/ZoLRo893AQAANFukfSBw37y1jCRdG9uR6hEUR5vamhM65ObzqFVKpsB0I1L0osJW+P2QbwJIJKe2SGzU2bHQfdeM0Kkb9gd1dQoAXEfDxOUkDssFcA8Uw4nPq2ppV+6oZXZ/Uob8pKecK/k9jJOx2w81XBBLBx+ykHOrXITX6pyQkULI0I0pMo9T9/sr8MGglWKDveqAAbmFCn/ZChgiQ6iHpdDmldBE1pJJh8wZIVH9Kr2mAxQbVA1kyKwEnQ1Q0phkJFPvN6vKwDcO3W8lXDOlH6vvH//CzGkWXZETeW61cduuTJ/D8AxAABo3bbt+QV7HdSCeGUMRki4kSbXCgDEchcxzK250rEBgEHj5nlFReVt9snmeE2cJElGXB+6+w8cEMR/k9av791qMBkgThnRsHqkzTkXCkwQA2bJ7KxkyH/UKpAriK+Sck4OBLRES2K8favDDW1uY1DIKUn5ziVpA6AzSKq75TBAqOV7I7CpVuIAw7hoXJBTqpFAClIBUQuO3KyEyw4GAIAMOgIrhgHAtt/+ns3+r8h7cz7b1m/QXd+P/GvO1qI9MV2hruz7R9mBSecOyIx/BhA7HIcR0LS9/iAAQFpWz/SGGp4BkJaZnmmljnTKzm1trGnlAACtrU2QkelwQwYArfHm9Ihjl9sS6hDa1Bxrzsxsrq/c1gYAkNuxc8OxJimFP1fxFXEXWxzjRwxTAYVgMpLpUngVRYATtKiZmL2GXLpSPJQ4VrrGit/aCmoZSvAC2588qoCkRQ/tVW6P/lgTbjuRCR1ZvYBrrkq6VU6k/iRu0dpNQomUyWVt2tbxaEHQeUetk1odLKqruKxHbQObhvmFRdO+JuhY01CyrX53PK1DTX3JtoYDNcIGQ+7y8o/XxS2WV7e9ur5fwcRbeuYP6VZ4y5gZT465qB8AAGT1GXtrn/whXYfcMmRQ5HD5TivnserK1h6jzxg4pOvIn47/3ve6ZcQbqisjvc/t2gEgo1+fgQPSjZbGD5fvTBt44/CRF3Ttc8EZV/5qwu13dc8wpk5AONiRZ1NCsQ0EU5qkn5kIRK6Y0kHk7LonguXmQsFt0GQunKHhgMm63N4QSKVLQbRxz5QzIhug2gSENnO8pkpUS0kziHYTblKgUAxPIF8BWm0jrON6IjWyM91ynTcqSM8KqGMSqZsKRmp2Um1smgq7XLaQBJRH26lAqVqFGaiC4BluCg/p2isrUlNzsBm65XZKrzlU1UwMkIp2fsRL3tp9+JIzAaBtc8k/XunyzSvH3HZjevxw9dY/rV9fDjAQoLm549jzpl8biVfXbn+meFOllbGtdMm2YT8/e9qjw+KVh9bMO9ICrRte2DFg1vifX5vGm48dBS5TPCzxTc9szJ919jd+NSCzufnQ5s+XLjjUondRMmJ7Tzxzh0HQpYdJ6/cVA14yAPmTeZz2ANKRAICJV+0ELpmhMhi437ySivBXKWXTUgxcA1/uoGonYEPsCl5nbBiXNScoHNwtNdJZ0KiXkMzu1Nz5AYSbM/d/FT91WGCRSu5o5yB7TGywYUgrGa60Y5/qeVwVYglXHMt07iCV0rpMLVfbTE5Glt93WLfcfJxOSS/Yj37cMQnX/hCTqYzLLvjv78f/9r3Nu+M4lW6EU/3hU7S/PUkIskassjjxiLEkidlxiP6l9w3Oi6PPU3GYGyZSG1CVRI2RtBjVmq55jA9qTtLNtF0FdGlMwgL4kil2yi1Crijjko960JbJ3JmJBhm9zWaeSbwG2gDClVbA59WU5IxaKlFL7NA2h1aVLA11+5x5sREEnfOc1oZ7JFb7hTPmeCMD06glg0jiIMh0w1VCYo+F1vtalW3BIpV1PpECmGywlw7MErh02smIB1+lByBjQ7nU1q83To1obwxz0+l/69EWxYra0wg98eQC9CcmSqp7CR8EdBKf53K9maTYCiCLduGAF09sBhwIMd6J3Vya8ZfJZuPzqGb4mJN66bFdco/OPl1mUBpFGx1M/hdQ1CzcYAZOxoDl93H4oGwbFg6AdtAGQiKOj1z65JOFORRL0eTGBlfcGETC4qa3Ks8Y5VJch6eEuIImvqDPBpKrvYif4SIP2P+0Jun0yXzAqFeLSHpl3sdqfm9mhRNrSZFJm9ZKLT2RHWAfOjMH23xdGnBSgo107hvgCftz1Si4xgAlU41XPm2nmq/WQ5UQ/VFtOLXttZBNlIAhmVoZrfVycQ1H9qVhDR6jJgA4b6GQT+oSc+Nvo6CEpFoYzBMEwdSK3DrIcIUyJ/bhPVxBbm4XaoXKYjR2gr+ywJ6VyuFkHOaKTUFVGeNfJTKKv3WWKLlwSVxOSZCY684HgVRVicIKsRqOXmAN4sE28Uyy+IYYAj7M/uzk8oPvwiKBvMBlwJUr4lstrlxicilSMJiEYZvQXzUBqYBWPOCZozqKgrDrZRu83sNqPwEe5p0CtlWK9YE6s5sWSHLxLDoLp0oTiqkSJv2Pdg5q36MSEg253GqBrMExobnjQTxHACDBcUWTS/Rm/XVjbRIc2EidSMlM/iuigaF/qoHanknOqCk92klVKLonQ/pQE9kTCYFo3GEBztgq9imQR5lcSihzCvv5RU+igQ1UO5o63ABKgAEW5GeU9dqJBVxJQFpTTSBKVWMNI7TafDqQTQMlmVtPG5gZOW8KWRcwZcu8Ad1RiCEaB6zUsUIJl/2ZYE/zVC6fkkNSvRRGc2iz5dCjOGdfIwDAaW7le8i+ZTJx5GOTTz1U6uFvCMEyLSppIcyjeLXra3GTy2mIPVqElXWKRSaGH69mSgL0F29ata2Q6aH7Lh/0ID4Dl1oC2RmjVAUjoFpjD/wnIzeXs3gJk9OpjiUB69FGWCHo0mhHRwAQ3yfBGV3653VD3lNSAzkMl616IFD+gL3QLGpGjpoZFeY8xUnesUcSgAEoZbNBF17+VqKW1tWaJDLoCApCUi5X3L5CkC1oO+DeGMYQszrVNnBsUVmN2teJ4cQs0texj5nuEkrDwK6nu9FAeXJdPZZXDN2T7rxYoKpskVQVBBYEJWQokOBPqYHbxZgue1AJMoAR7DPFMkNmcdlo0q9kczXzYvcduXZ/llKY6sm5PoWHX+RLJPjtCjHNc5fhJMnsaj/E45PsGnnNhgCfuOrHDbXIG8hK0jkZsdBjOEeXBXcIJhqcYijOmHjznWplIAnEKcIKwSlTAVzpReK8KT3IwEDwH0c3yGCEGZ+TAEcK4YDWiiEecLUPC0tgztxdAQybIdfAGN4KRQO5dTAEgZyA6UvzFG1q4jqmlAoogYrfxGjUTJr3sHKsRnqrQQAQlPUEBkFxToSPbWzI7Ry09NR3IWXAtP8X4anSvZB3S5hSRNDMuIEDpQZtO3AIpUcX4gwFmatHCyo0H0eZmG+GxCRgp9QmI4BI+AuT248gBxmA5KbFS3vqDhjNVn2ngwroxAOYigNMjEo6D2Pb1ZhQG0Llu4BKJDbgAQKUq4HE1BAk5nWd02gl8kIa1+QTTeHGrwnUTPvOQiIguciSB0HVLUkKmQvIIr/aiPA+2gwhUAr0xRmEdFFZDzrkSmo/I8KXrzuFO5pX6epIkMJ2TIFo4VmFbbWKIoYwd1OSSZoYZXzuE41OAqKTxJcasRiTCXczRYZHE/j2dON4mxKmwuQCiDpuLl42Dn+/WECPeJdBsPAL31tQJ+VKG9kaubFRQhWRMsFBawhgAEAgiHdzmR+AMpVFeEYIcdymlIMHUNXnOiMCl+YR68oF5t0+LISJXzYR0UOZstJjteCIcNYd0zhNRjyrxWRClTC5Y7pu6SEYQ9XBG3cTJhekQrPexIAWqCSAIVdr6SSqszQvRnuY/QPPYzuNdxVkpoLdqKJvIoDWfvSBDJtGKCR453pUrll7ivnedeCCTdMKRZ2PtzlRB0DDzIcbnppCEBDjkLbOTDoUZJDJt5LlhCGwTMtQudko7U8t2qgFiepiuNSP2qGEI+1kXPFzhLo+KE1GtZji7uUzGONtpyNM9Z7g/jJW+ovRmykSPNxhozXFSffqpOUFN0GAsgCVEk5QHjP1JJXwpIR+PjX1XPkyM7cPpUAkLLzY90klvsGnTeDjPn/R5uaGY5zFg3FjthQWTL2vkukAxtlkm5jJQYNP+qk2fa/Os+7mkDZl80MopoR9CDk+nUQlg+akzD0Qyzli6NDdhScFkbJSYLfPZa7wVWUa4ynBZsQ+aZE9UmrP+eLJJL7GpdZ6z9lYkMHDg3cmFnuYSALCCYZ+goFy8lR1ZBUKA4j0XJ2d1bFXP3abPeQBgoYLXP6FvtCAZ8+eDXIcmKA4CDFkCQQEoPdPxEYvO6VXoQmLuwNDr4tUyz6gtnhwOLVE0wVXA7Mt00+K9eML8Xm4Vji1xUziUxA//uX4Z1dxjQCiNssJEcIHfcxQJ3m+Ob01ind5cQC6rOY3OWw/7FMLSqSRTNtlyE5lndKUhLLn/RiygiIgU9mtGawTeJFbwEsg+J2FZAGAgqPHrC2wXf+hQuAmsXBK0sNBqCghhikpNzFJQ0ZwACaCU3UcN0wI/fGIi3+yavf9Gc5TzEFePORFpNpLuHLgLxgE8UOhkiaf2XFSddRMjQi2MDkObY9rWGEAU4ye8RpDCCWUThIyqiY9DYUB5fgsHKmibV0iXAlKQvmPj+WCDzq+MherXdTyxwWy5mTNqzkA5xYZ5JhkijdvEB4h6wDx3oWgRiQoqZmFcTHAEDT0mkpCEoSXS/9hUUvUrNUkVqiPlxiKcfuM8wVAlx7StSmT8wmNPA2IJgmCRCdQCN5ha8kkrL1bOU2eiHKvlUHlgs+cV5pHc1QjQAcqW0AWcPQPi8pjghjkZy1WINA48dm3Oi8lK4OeFCoZbJd4nQ8ZwEWZiw1mjX+kakY1jymvNFPmAOp7TLTRcVq+XOIRNkzp3O2Ehmme1MsVLQiaMnDcs9wjF/K4BDgGNaQ47tBAjmbo2tzhu4U646f0hegM8/4Y6T6J1O2ThDtPEc4JWgjzqlXg6AuaEDM/O8DxKTwA2Y3A3KbghCmcllNP1H7itb6StGRg5cF7twoc7iWuqsK1cKMZAEJ0U/FMJZczqZgbiAfp2amqj5PLwhof1ahSnNNq4tfLoUvhPOIp4rVOgcVikH5fdfekjKEt12TAjUfa2G575raJNa/m7dpDTstJIokEWGAR64PqJ50lC5ITO1AFpcMnfUd0joGFADDmsthPqs90ZFbrVqHSp9ZkCk0NIxyQSydpaRrFydAcF1YDrZ8xQKjspTS1ICgKV8ciV6V7jbtLy8yaJquv5j3NDU9JkYbB9ikiw5PbOQAUJMb1REKaWYoBXK6asQAzjhnSYXwkHNQpgTP0izuZWNBaGoumQIzeiunuo/appZYLJWCOhmF6USa7QIcMGgpnqnY5f0IGy6Zjc7E+yzwwcXQUV+251HBaTpDgVm8/PuiEkw5prYUZaZJnUKScpyDG7CHdhFUJCcmHl5jA7VZixx7Hy2BisU7+lpihOoroWQzRIt456PwE9FOCFj2tDCV0tGTob1Cl5sp4MsFkhYn/yCyBo2q47nLOuiUn/Gqi03JawLpfbIpk7VzJxNzkXTXqxJXoYN5dnifWwTCf0PZ/Jt2rkO+UK6Z4zxXxTIxQdoamwEzt22jFH1uGLiQmhJK65vlMeu2iMUKbE9Ikya7NiShgOFiYLoVbmiCAaLJsJbJHXJ3dp+XLLUGIR8KSZjMkHZ3T9FatUFaHJ6LWbIcnsCyY+AwHdXvrFgXer8KcnXwSRGtn4LgSXEmD7RNdlcs/weGAbhuq1RJciIkl/wTEh0t68Tzu/BW1Mk0NqCrsmAQtVyGLy79dj6kNoC9X4YZ0vDktX1Jh+jBMgWTYSpXX1bkBGWBerMAohkK7h0eH3DT9tm8U9syKHKvdueqFp1/6sM5gEyU1iQkhCfiYTINJL8PIqJI5UPoj6JgY/iluddvJJF9b2EcQNQHRkMEAjNqputZuQzHKrxS0l9ZOKQT1qcUNbrRE6F3M6enzl14wh0lVc9o4qOWDypEBBCWLuNw7RHTmjrxiar+q1+Y/VRzrev74Mfm9o6wuplGZZKdScck4ScSdi8k5VSHgSKitOnXDejlioYzel3fWuXhKGpVwKfuUOWqs0pHPeSgr6EwgJcIMxyCs5GBzZ/svuu7u+8EQyaUWOi3tLe073pAhPyURmKHDQIRpsvSb+tu7p+Su+9OdizbFASBjxE//Z+ZFdW/NmftmqakA5y5eVnZnOFS0qqSsEqB00SYAiAy+bf4dfbdvTR8yqn9W4961S+bPW1eVLAgyBZdorUy0jhSMFREQxFlwYrwSAOA8KI2vEdbtdmaNtSFFn50rUWPM7TsUaIrBSwtGGxIT4m0l2GVCz+Wdj+4NMPTla7+tkafZYgqEdBuTP5PFLnU6l6SY3j/olCYvBgHE423NCGbiLW3x5tY4SsKUEAY4Z+bcpx+femZkwA1PPPHMa/d/Z5gwPlowAN6ZM/vOn79eOfzaqy6KpAIE/dMR0qN1Kpf7t2C3onIEcUm9NZ/YIjVgUQAAIABJREFUwX06NWuCxDrNBT+IckwWO2b8bEFJ2hcziLel9pIIIP4rPo5H7p+Ae2yq4GkQTFgIHQDFyVqfq28eSbBs0rsS1NO3z9CcnHxyVuWDHnTD+ykUDgAdevTqXfjV22cO2DLvxfU18ZqyA0fiFh+8s+/bDz60+BAA69Iz+1jlkbiXKr3ylDBkghdqD1SbGM8JGf7pkEHJDkrMeCCGElR8yKBXLnHvFXQ19CpJqz71cEL8LNkgNkQxOQcXYMnFOb2N6vFpQAwp9Ks7xKWg92fgb/UEkSSbraFuX4aaOcgZ95Kmt9un3W8ENlUe2B2pa4F4XVn57iqcIV5TdcRKVF95JKT1lqSGIXPDT7XvcSWZaAGOLJK+JstkpBQu4sFW9/1t1wSBniKqgj+BwAz1JDnsi6r6doEQJtfF9SsHxpzNPppVQm6vSgiUB1kFKMBHx6rTEkjwTjTp6VfwHIQFH1S+PH8iJM2eSDii7T76OZfmgsuQ0dIMSSTPS1tDMkBZEZN0tY+o0061QtrzLupJzkKP0wB5f1jCpmlaTR2VFZGnwWQVQFeYoXRSz9SLOvPhAGA/Qc0dVMYbBJy3ceO7ybal8ktrtChLyONpUYUBSAsU0icoNJHHaC7MB1myxDD5RkqzJ2lIYyCLEme1GpsTqAbX9Y52FJUGeqdxf+O5MHdW9PFULvEaMNReGqMME1yMc1xzzizKpFiMQ+3OoLTQxACY8+ZetyacGT/TZ7eCotRjxAjKq/9jRCzDYk4H7nuU9UKC1MnCWMDQ8xa/Ed9fzPdJuOaw1zd//cj8J24eHrFORYbPfPDJ52dPKVCyikmffihPXsRs9SScwOB7Do55mImQlUE9tQ5WUDAx6JaHPyYfyOlEhRDgHVfnY+wjGIwSiQEGbQ4HLq1dMSZVAztfBXNtAP+Hi/zqeCz0nXLKVTeLo8F9DF/VENYsw8QomFAc9I7sSGYkM5LJ04BbZDASyciIZEYinrn9+0uo7iTi9yREQEvIWpU41u7sdi+GFJ8FGEpGsXnajGaPOriBH9PGV06Y6Ci1hXyMSfurrWi1lhO5k8rJyWRnYeDj6N9/DhT6QT95LlX7vmGbA6Bn+KVvkzEpu72GwVD60BZ7TYyCaOjTZ2iuc79YUsFBc1Kc0i9rSuEiLw6KgVfqmglPqU4SEFT7h1xnztwbETgJKPUO5watCqN9XPvLpNV4BWc3zLmPl5hGf2Qc55wxxjlnDhhan4GQc6oEkCjiatCeiqK2J9NFGYIqrhwQ4Up4q1/sUX+quQILjsxQTdVQt0/ig8z4I7TIlIcELBdzxrDBhQfuEyJa1kSajpx0OAZHudVOHKJO4SbS8uzXM6OZ3sk8SazqhLMkhUJqwiV3W0/LuyAImIi4ZEbWBbqZtun4lBHVg2oMKHyNcwZAUUxVKmbB9lKEAlA4l+bB3tBhxeS2DCWB1geDCVciCf8kpFV9R3OgAhK3LgnBpgtfc7fCLrd1UoqXbYm3hwpRKTyTT/oL03VZVx8ojSDXwlAMaSBNIIk7gSd0h4Mi3PCTu4sS+nuY7tgjPMrk86D7eSpOkAVI2fwE9G5FH5i0hxd3f5j9Hx3hKZwxt38I7MP3WKQXGCMNjAVxPFcOAoqEgzpUNxSl4cLM6fnWDxM0C5cxHjKmZFJynESL18jdEreV62wyVgt/QZ2hDVJcKp3NcOmiWTAiKPaIV1w55yQ2EMTu9hPidwYMLb3bt0ro1motn2TId6AkYLJ/Twlx66dOS53bGvhuhkO0AYDjdT001irTIBDndBEoXkHi6JfuwCCsMW8wUwd90VrBgSI8H2RO2foE5GMR6kAs2JN27czfHDOjSZmYUU8t3R0JORrpOM0qJUbKtJe8DPPnjfpxR2ONott04OC6DgRPFpFNch80Yc7ALHVKse9aC3x4JCETAFzeSeiFkEJexskQ9uE0QsSqgjvnFck8+rw8JeakCIGA2Nn4haZMS7tALoW0jRdd0Inn88Um8XsukKtwodMBYUJJHvLbRQTMJTDuK6wLdzCuOwly84WAd5/qc0VxUNHY4IaaFmhOKhGDD7KNyye5vUrhPIdCXwepbQ7cQVHPPGmJofRKZCafV465Uzt30dfBEGcKQPZjSjMFPJnB6uXEynWQk3IbDzhDT9tzx0675dT8DGiwaywMJi4OSrp8m1gP0GpluRxAWD0PUg7JlfLoU4d4ZrgaUgggYoqB1YeA3KCplXYJRgMBOcCOTRJPXN6JdxIKftuuJZh5WLM6jBEOpeGUntDJNsg9XvuOgOPkERMFYWJBgHMAzpiFXxwsJBOLcW4a0dbcRRRnEsrQnJewYsBBo3RuMkRoehMjvhSTbrAtARXKmZuL1NpN4ZaSQEu4OChlFqFjyObZtRhaM2Baw8K+gF6gCAOTQxIU0WyECQQuQptQSyVMhUPAhhOm+vNBxShzjVTiwHHEgg7+TkYyCPppCgcysZOv2mOx85FThsPVY2olv9887PwhZDdVlyPohmV0hLmbtXPIum/OcUiKPNJgba/N4cowR5FITqNZDiwdC7V/cvU3OctwxeTpDF6Z9irfvRw2Qg3zYkeNsQcz2TaNAnVIoBOQ4I/Wirq1Hx8MijJeOkCOH64kIM1ubF2TBBoGkCZOAtpL3DGaox9WZkYen4dUN0OKhBMCaP0nU0JpO4fWL/Qk97jmbgcwqjNYGUacWxPWAUN4BQ7bs8COY+xzrXe3KNuamEvBhO02n+SimkwqXWijiOYEu6kH4ZMyaDvYZ78Tg7AHU3fUl089RorzEwMO+vFBr8HSVmAyT7IwFDH0YFZhRQ3thDq4momM1LiyanjgGUKgYkMNAziI/HKJKQq470Pk0uWQiH1iRMMwAEC2H2/ScGbK1k9t0KtDD6FADOvy8g7BvsBQyLnD7AA4pnZOuXbBMhO0zgibnHmxs/jnBIeEh5Zy8qibeXYjVcB5ykitFZNVUTonjJAcwiXPi3vWYcaPULTG/z6JXpFyW0k1Qg4rPcbrXkjjpTOFLCR1qnBX0Y4PpI4iYEKYEKLuKB4ToLfkJj4nFTqJQRALfuKLztEYgLRWxi0AUCZBTI5YQXuYpEtaNQB9K4ndJ64FQH8C4q0uXcW8jDvnLW5Id+Fxe1FPmg7bICpSOmDJnK3NEm10FhLBra1UK4yA1KtyAiJk1kVZIRXcobCH3TaTFxD1QqrgLebnSZDdJglQhqkbSff0/NUk1KU9DMLHiQIi4VuECXowTiI+1Qo1rOHyw4yd7rTEfZefSiaT89dxE+280yJ8Diuyk4ner5tOg1RznF++84IKRo/TSnSL4513slkuPjKhQGyYkx8yE9NhSQ/n4MyCuQL8OD2TU9hx5ViojVEBW+owTpKBIUQxgKpdQqvHSSuGB8K5xDKuPJAovg0Vp+Z91J4WS5d0KRASYDeK6jFlRhwI3ZOEQi4Zlow2MsKpgqtMCsRR4c8K/Qc+NQNiQ2GyAX4jjjhpwIiTV1z/im+0grMGBVKH4kxAFVaA0USe9nKDZ0VftadvVKMk2rvabpEWlZNqIoDP4a0uNxQ3gu1jt/W5tEoolg5xLbkDhQ4JxKGpTmocj6B6+wUnQ9pIF2bysZIPeVsTyvIwA/L4ZFRrFPN9kgA67Kjy6hukpsLPwelSuwhm3kkoADMTFHUkyQgOG03g8t+gpjrBTfQEySlAUIo7goAp4eSpEJNPcD93x2nxoUDTq34EIRYTLvs5B1GMmWOL2TF3iZwmDVl1I7NjC+PQRBWc90M4k3d3UmsDvDAeVZuBdJNEYJw740U2KCekwVmFrQSEI20EXrkuGTqFXszFiC1cGZDo+KRR6Cnm+yRc+mVK5XVZc0UbveF5S6KiJWnJidJCmjNqmYFwWDss+5vj7FAP6ShmOJZ79UnDB7W143IKd07H6CVNfheYuIxT6NFXwuPsUrmcXadZTI2BMV1KpkyQ8OoEWktk4HA9URVRcwx/4iVjmHpwOUA50B6BUY8r3SRU45P5jkonEajrOoPWySKfO65oAiGBjmO+T+JLeXFh2mHS/cuVc8z5LxFYC2aaXoIx3YCavIXpSlOJsF5vOCO52/icu5PBYDltEilma5KdHHGlk0ywocRpuBNSkoCPCTmxOSCTPMGccrjDFjlI7cOUdUNxXjlp81Eud2DrNq2Vx6Fv9r1bmwgyaa3QRgAmlvvwOiDGOxV0RHVJizLkLo7O4PShYpI4Xx5aw4hmmHFaRGdQYpHq93wxYs4+XiCednRwepaqYdqcfpJwv0wRCILS0Cp8qcOSGlpGC0NXUPZi4EmBNCAx6bx4HUhYU9pRVFvUBtV43GF4jGRjcrvRBTtHHd5owxQrOJqmCZIiQNAlmOB+ex7fPga3yZkDlFzxvPVmWfItZuskWtCgNVMHCcLCiJAAVQwMKtq85CCQyDea5EHFMdZtO9q8wSXDbAE6MDtA8ppSuKf7TMwoUBcO3M81pep5eOJquBJUeBQkI6LgIdQED7ISwiJE4wLkcMtELaXLmiA2p16I77xZhut6vA+cRKmrEalEG01cRWKkcFGMSToJa3Y7rX3Zxi98f8bRYt/WQDfryVSJfN1Q3ItRsV39GRYUmPI3kTmKI1w+DqrEJaUen7ITJF1+G1L4UJVwkA4FgZV5JzR0adp+8o70doHCRPDFR40VuyYQIzEgRGMFgcxE+KAYMoM9qYP6kqDtZBbAbVZ4EiCgEJXvkEt6N8p8mWazuhMeFwi0YUqIy7fbWdGrbg+0NmZydMZBWw7ojjCCOQB3KRCDIKmTVkywn5gkg6QmvhO0SMkfQGsmMcTEl28891Fj9owYqCkhzcWkBN7CpR5IOJQmt9oHAkoqerSwSgSo6JUEaZmSS2OC2pkTMdJ5yU9w1OLSgTv+OuechcYwGxHbW8hED0cZQUZm6oEcacGNhq8KEFTX4635F6Na7UsY/hjTcxk8y2NSwItbXIjJutNh8Xpt3/7EEo6idhBfi4XL9WnoBZmtYk/aL4cA3EIBJdh7twI535zRPy+XK0DK0zSomiiUOUmLahKTw4/hdBhoOD3vAo86fgY1BMVK8Doy/S9HowuTKYBCbj4ImBF0eCVEHXBMVNxtJWk4Q8cYBO3zjjfczebyUqAbjspTVgr7k/awcI47LV6pECVZBYjvkYZ7uOwkEF9OSlogjGJ57LGZo/sqaEYVKwTNET0OemCz8ZIHnAudxlq6CIKIoUeoAyQx3CUXRtg8fJYim4V9jvs1gxoBvgQHcEeFO28LnFWBUDk3vhB+wqHCPQToElz3kysuYuY0WIkEa6QkZraGO7NXTK1pSucGiGlntSoOW0GUnQNzv+DKZZ6pjGuhw9ajqx5P8WaCIDeN2r4BCqCuct8XYZ8WjS0KJCSKpZmK1DRsABu9oVAuWpvOGv2siySbJpK9CjVLiuYLFthx9LFmWzmObCsanakNE3cMiTE8GaucYkLmcIcaGfysFEHepeulHLThhpJpDRaYhedKKl9QRw4PQDOaSBgwhltB7qh9KA8meh4Ujbva8XwYnP5J5tjYA/jnyYBoqRWMSYREBIs7nUvcc2g9wViUa0uam5/Qed0Q6GGAn4EI29S4ZnIixzhlONewqmAW2SpSgYDEAAF/lse9DcCtYpuUgvhmAOgBsoA5vNJqH4cIJiLWtCxMW6gHldM2Ge4tTMmo1U+F1N/DYike0UMjjClrfNqyMVsU0zTNEi7pnQzZeEqCoLcEqq/+eTvrEoDYU+kOOSpauK5Nc88rOo2xpd/AKBUSKIGWLUg51YFbz1ODIEBKpgnW6zvwT/z4BnOXiwCiOdE04Jqgt4ika3ySBoHb0ULkQ2kV8/CdAe9+bkk0p1M6VUsoJ3jCFmY9mJyRwFQRM3HvaUvShogLTuiBfy57xqNPAiLZdgkM3QlhchKpzC8J/GV1iiaVn4QHD1p9NBrh2/oAYD2eyF3aoTxrKtrbbpM0rFYpx8zsyDN/3hRVd4lGDTUM0FPj3MMW74KIGBWF6E9M3MLj9JlcxMNzx938f+bNmjzA0LFSF+H4hmRIVOAAcM7MB//08uwrCtxzguaQ2FLy2uGbO+6798ybNblAnPSmZlz3E5/Hw6LaN3CaYKzBfIlgnykltkDto5gh6rMjY93XJGiAzzQAnNRoGCm4+Ee//Z8fTM4On9VjxPEXrvwFO1DFuxcBP1ItZSN8kIM1L9ZPNeUiokOm3fmr5+c9/dq8xx+/c+qoqDMiulncvz0n3PPSPVPyvWtlAraMkT995JnXnnjmtdmTetj1gcyhtz/96A/HRDy1BRHTVCtUrHFnSAcXNiwdDKy1v8jwa2bPHFr35qLlu5S5TqJyzsy582aNxC4QjCIEKgCkF14z96U7xzqKmhpr62rqGptRJTL7TZh9/+MvPfHsa/N+98j0S/taZUWH3HTn3Bcef/a1J55c8LObxnW1Cswcfu3sO4ceeXPR8jLf5saGqxNT9+o5M+fOmzUq4j/VDdRtgrtcm5LgltSGPSb+n5d+OSXfiy/LbcPQxg7AwJd37d1/+vXEXGpCyhAw8rU75j9x7UCPDpSYZI287b4bzihb8sryOudU/nWPP37XZPPjGa74Np9XAmlSaa/P2g1FngWSfuAxrefEe17+5ZS+lqIMoZaL/1Ar2YeRi66946ren7/81AslLX0nX3/TjCtL73q1JA5yi7rcCFnr2z1Igpbtf31sTtFXZ8zq5yiTn0Bnun4UYiTxNSlAdvsxVHQSP9POeLxk5V8eWblrQ3UcjzzJFAsAjCrAD25BcPVc+m/nC4/94gXpeuS8CVPPj30479F1NZGzJ4ztkZ8NFXWQM+KKqf2qXpv/VHGs63njx+T3ikJdDHhzycpFj6zcuaE6bllErTBRVQKC7rhsMvdEiZaOJqRGJXruVbEtByU+qWmgLY3Fy56Yt3hjWY101ncdJUjt/PsphkLBAS394pW0xkCjFmXgVACMaz8pXDCssFPJ24ve3FoPsLPyH71/VNCxG0BD/qSZN086v19uJN5QUfL+8wvf2BgbNON/7pmcBwCDH59/HcCR5fPvfrK4VV+RjIKp02//9rDeWRCrKH3/+efe2BgDgKaqA+WZdS2oqgDAIDL4xnvmzeodheqdy5f8ecHGGsie+NCDl26Z++DLB1qB5V43e+5FW+c8n/2zOeOz4wA1JZtreo0YkFH14Yu/fXJTA3UgB4C0gqse+PXQqqLm/mMGdI0f2PLawqeWlsez+k2a+d1J5/XLjbQ07C15//nn3th4tHDmQ7PHRWIQ7RKJH9lbvGzBwneK4xApvG3+HX23b00fMrJfVmzv2iVPzltXxaKFN06/aXJhn6xIvLZ8y5uLnn2zvIlFB1/33e9eMaxPTgQaq3d89NenF2ytAcgdd+0d08YO6NEpPV5Xtnbpc0+u3g+jf/T8zQNrYpHc7CjE9hcvW/DI8t3R8bMXXH8OAMAdfxoHALte+dFj71TytPzRt8y86oLCvGhzrKps9au/X7Kh0hAykbyxM6ZfO25AN4hVVh3tAges0+fMnDv7a9kA5Yvvevife51Wyc3uWFm6YW3ZHoA9paV20GRld4ZDH68qLasEKF20iQNAdMi06TdNLuxt1fTvi55dWt6UWTh9/h19tm9NHzKyv+OTSrem0fT4kbK1S5+bj2va1anpe7uzxs9ecAOq6c5XfvTYO5WQlj/6pplXjS7I65wZP1Kx6a35i5aXxg017X3xzOnfuahfF4gdLvv4b/NeXV8FEOl9+czpU87vlZsVaarZWfTywr+sqB40c+7scZGjEO2cGT9S4bQpRAunOc1XU77lzUXPLi0/BtB93A3fu3H0wJ5RaNy/9e+LFiwpy//+g/dMzgMGgx+ffx2z47wNoOuYq2bc+NWB+dEO8dj+4vf+Mn9ZSS3oKXCPod+eecP4wryOUF1R2QlimwFYev7om2dOddt03usbq/QVzZ92/wOTO9VANDcrEq/ZteqFp1/6qA4ge9SM6TeOK+yeFa/Zte6NJ19cVdZr6m/vv3oAMIB7X54A0LJ5/uzfr2iByODb5t/Rt2Rr+pCR/aNH9xYtmT9vXRV0Kpx2+3cnF/bOynDatKLJEFO5466548axA3pG05uPlK1d+tyTaw5dNP13s0Z3AmAz5j07A1orlv36rqW7AbpO/elvJresP9hr5LA8qCz515NPLy0+Cj1G3TDr2nGFeR2aj+wpWrpg/ur98a4Tfj33uh7Vx7LyumbGj1RsXPLowlUVADmFU++8/vJhvbpmxg5VtnTtXPLnGQs3Zjr9NLOlvqLkg+cXvrExhngBfiVPdMhNt980eXDvaKTF6ZL9Zzx4z+RuAGzw409cB++8el96dpcenTplO2zdXfDCiB0ZetXUvmXL3tlcxwHg2IGtH22rbITe375z5oWxFQteXLxs3Z6sUVMn55a+u+2L8m0bN7eccVH0k9/98cW3Vv17w+7aRmsGrYwS+ZN+9LNRtf9csvSDrYdyR02+pMvWZdtrrUvZZ43/eo+9y9bsbAQAgPQeo6Zc1KvqgxeeWvrvsuioay7vu3flhorIgAlf61+16sPiBs6g09ljJ+Yf/GBzh4sv67Lpj8+VFE6+lK3646uHz7/mrCPL1u3R9Zq03MLxV5zfq/rd3895+q2yvt+87dxjH6xrvvLOmaNjK555afGyj/dkjZw6uVvpu9vSzpt4UXrRH/7vvIUvrq084xu3XBbd9E5JXXr3kVPGnZu977UHH33m3ZrCG64dVPXhptyrZ88YuPf1lxctef/Tqu6XTBubXrRqR9rY6b8YHXvzuYV/Xb6mJO3sK0dHitd83jzq5vuv7l789+efe/uj4oZ+k6YMP7p2bVn3C685r+P6Z37z4MLFH9UOuuZbZ9f9++Nt+3Zu/vRAt2Fn7X/rkT++8cGK9SX7jza3dh33s1lfT1/70lOL3/53Wds5V1xZcHBl0YEWXch2ufz2/746+vGChS8v39k2aOQ5ubUb31hX3gZ1e7Zu2NxyxkV5+99dtaMeAPpd+7u5d13WPT37rPHXT7nyyh7lb2060ApD75z70Mxzu6XnDpsy5VvXn5f52UefVUH6sGt/dsfAva+/vGjx+59Wdb/kprEZRat2NNo++duDjy54t6bwhmvPqvpwQ80Ip6bLVlk1PVa0tizvwmvO77j+md/878LFq2oGXXP1OXWrirbt27l584HcYWft/+cjf3zjgxXrSvYdbW6DwdfP/E5+8Uvz//bWik8P9Rg3qeDAR0VV2sG166RbZ01qW/Pi0uXrKjKGT5zQt3xF0cH0S75z15WZHy148bU3P9radOblE7rvWo7adJHVpp02vlvaOOza2TMG7n3j5UWLV2yuyrtk2iXpa1d9nj52xn0TszYsWfjCv4r2dLlw2vhuJWvWbNy6cXP8jIs62XG+8YsjjW0AvSbNurXwwN+fe2bpirX7Oo+dNLR+fVFZs9Of8NJnxvDvz7qxz+evzX952aexvqOH9W7c9u6K6gv+e9bX09e+/Ocly1bvstr0g6ID2ppmDx9/2VmV//j1o08seOez7LE3TehavGzb0XHTfn59j09ffOavb5e2DJlw1bCGVSu3l237dMPhHhf1K3vhwb/8Y8W/P9lWG4sDpOeNvHLciC77/va/jy54t7bwhmsHVa3cnHP1z2YM2PvGy4sWv/9pZfdLpo3NKFq1o05XfNbIm++/5ivFbyx8btmq4sZ+k6ace6zo30U7Pl2/JzJsaNO/fjf/xZUfrC7dX9vUCtCxcMzkS85o+ujp3zz4+qe5l948qeMn7+4eNOPHV+dse+Pl9z4uaTpjwsRBNauKytIHTJg4rPnDP9zzhxcWb2DnXX1lwb4VRVX9r7/ze2cfWPrUojff3VzeacDI/IZP3tzErrH66YuLl60rzxo5dXJO6bvbD7fZ7nVWBhljLH34tbNnDBBdcuy0sRlFqzZs275xc7y/3XybNn6SQRrIegZcnudCtFMmHGtukdsjOrCg96G1jy79qLwVYGfF6jHzLxjcE3ZWHNgNdXHecqSifHcFVuIe24NjQ8l7z5TtWF5yGCC9qveYe3vlZ/GyRp3TAQDiO1e8t7E4zrcceH/M6ImFvdOLjrgX8UAbP1BSVNo6rqW+pqSkuNdh3i83F6ARJ0XT9+ZDRYtXltcCFC35bVlzTW300oLeh4oeffOj8jaAnRVrxsy/YFAPKAOIV+3aVRVvg8Obl6+rnFMwIBcqGgEgvnv5m0V74wDr/nJfaVNVvNu1+bkVKx9bvPEQA9gS6zful2cVRqGkUxTqNm3cumMXQEn5HzZEY42QNqxgYGbJWwtWbmkEgDJeOPa/CvtFVgBA3Y61Ww81AjRu3VqROSE/Lx3Kq0rKutdAW6R6T0lF3KpDJH9QQWzTk0tXb4gzKCvvPOyrNxb0jWzcqUP8/oPzYcPri1eUNAHshsGX/Lyrdb6p6sBuONLsNtH+5b+fu3XMDXeNO/DcvJX743VVcQCAnYvnPVT81dtnDtgyb9H6mpbDZRwAcgudmgJAcazfuF8OLIxCFQDEy5a/WVQRB1i36L6SY5Xx9GEFAyOiprvaCi/5r8L8yHIAOIJqGpnYD9U0s3pPSblTlUg0p9OxitLNG8tiALtL5q6BmImkxEvWvDJ/z+qi6jaA3TkjRp/fOxu2Hs3KjjSUb1lbsjMOUPr09r/Hj8ahECBeVbarKt4G1ZuXf1w5Z8DAHDg2OD+3YuWjizdWA0Dxsf7j7jmrMBppLDwLtj67YPVncYDiskc2RGNV8TbYvxvqmqGldq8d55alXbLgUPGmLcVHAMrLSjdFGo8i6/C8uNfgAdFdy5e8v7EOoOxYweihhQCRfoMHxDbPX7p6YwtA2Z7Ow756Y0F+ZJO2TQGgtaJkXenROMDuDbtqJvfqGYH0wgGR0reXLCutByjrMPTimYUFkTWbKiqODY61NdXt31W+W1LVUrbizaKKFoB1f7kNUhS8AAAZT0lEQVS3pKmqJfe6frkVKx9bvOkQABQftdu0IqYWnV4wYGCk5K0FH1rR22ZF77KtFSXRujjk1JSXlUgjcmvj1mWvlR2Jw5HF8+9fXFcDGfDh0mdr120sawHYlH7+2MkD8tJX1DGIVxVv3Fkbb4X9n5RWf2tYr85Qkj+g+6GihcuLylsByiLl112UYYOP008/r1gzZv4Fg3vATmtOYy8Y2fs6cgf3y61Y+eiSjYc4wJaj/cfdM7Aw+tby/WVQF4eWIxXlZXsb6uoznHaxROyVIPcIuX0BJe3UJTejz3n3PD1ZJKquyAGosE3RibNcbK1FNrbkjLn5/u9375yZkQ4AUMIknCQSjzdbpsVramLRnGzgmnGKMQBobgVobY5z1sKbWtoYT5eWh4nm6kp7Lhmr+f/tXWtwVMeV/lroDtZI6AEuwIvk0mM9w6JRrWXwYqgACXLZYteiEmkTgxMbYeMk4CzkIVIGYi/rKuwKcRKcqsRVLpKAk0AgNnFQXGa9gazBJnbwIrySkkhZNBQagqQgpBk0A5o70t0f99XPmdEI2UbOKZVq7u3u06fP6f76676vPgAFeYXZtziNMgD0h4qYsqODsRi8ebkmtuoDf7XMGOoLAygoKtTK6r/5Ur3TirOFObhw5kTbslU7nlkY6rkYDLaeeOOtVmTl5edogbV7v7/W1j7Slp+FBKBbsxriehweLdv2OP34EIGnYJqnoKrpucXOmejvp4keAYDsvCLvlb5LCbMJsdgw8qnoEmrjMREOhuJ+neiRvo5Qt+2qa30Xg1pYhx4JdgftpXdBUaGnrH7nS5+CfV/42cIcGDCgD/RZPrnSGwGg5eV7PYGH9/5grb2TM9pWkAUdSNgt1fU4NLelnOgdR09GNjd+c/d9oa7u7j+999v/bIkpoOEacuY2NN2/qWCqB1OAka72KUDs9PF36xq/truqJ3Qx1NF+8tjJP7DlRwevmjEtnF6oldfvfKneciqMs4U5mid/6kDwsl1iqI/BBaY/6d0n3zz/lUee+k7t+QuhUOfpk0ePddu52B1AzZuXq1/ui5mxi0VjAODJz9MKqpqeW+TsZEVP5ckbCgCI66ZRRjwxguypnux8b861yxHTvtGB/iGtJN8DuPv4rBhxJ1JDfREABUUFHrv5Zv1nC3MACQ5m5eV7PZVr937/YTvnSFu+c++JJI59Pb2mrdHIAAAk4nkl966r/8IsrwYQoDdkjdJR3QJQfTgOLVuDphlIWA11mpEzzRmnlkf7Q0WAtbdjEOtT9IZhoLCoQCur3/mLescWSaOs/UF6O9/xgbtpG4vpmJqbPQUYtRMMIAuJ80de2HvCwSM9HBzDdVvvkrpPlvc3f++nfxxIYM6y9eumU6lQ7LbSF0wM95wAFZAGg1Vl6hplR5TVqOMO2UyEg5i5RKlsJM7jtt55+Nt72x2tw30RQP/vHU+2+H1z/SUlZdWf3Fo5ffszrwKItu37VrMz249E+4dRyVjOXWWlDgwARv/J5184apORkXisT4EOAGwuP4btfudtKAb3NhXb4fHOw9/Z2x63Twz3RoCbieBSwGrp/9nnR+2WyjZhJGbGWg5tf/QN3x3+0uKSeTWNj5dnb3v21BBE0arq6v5R/92Pnm4Z0DFtyece8wEA+lp2f7njtYC/oqy4bH7txoWzvvflg+Ji03wYS+84/O297brdxuG+SNZdgkGCl2zRz+3/dtPR8nmBklvLfQvWNP1D7lM7m/tZJui0VXdXJq6H+3/3/Au/CVm5RuOxXnVMnQsDzDsgWEtHoRaC0Th/Lt7R/J0X2+I2FRruDctKggCItu/7VnOXDtMHo9HLw3QqJwZriVZ2z6rFN7X9bNf3Ll6DVvXQpsXyOgDosajuLSwAegAYHutJYIJE95EX9hynwYeuzXlJLYHdUdkhSRlpACTb3hikq3eWxRbWJPpC4enFt3oRGgKQW/2v60s6dv8mMohpnsT5ju5RAMgvmhW7bLp1OKEDmpbiik/BrIKs0MkTbweHgCwtLnov20NrcHY9PQVF3lgwAiT0OLI81jQyxcokelIKzYTvwJZcjQximpY43xmyGjUzNqBjJqDl5mQDOpA1c0YhIkMDrDJbrgwMwusZ7uw+bwDQimZp4QEdQFGxd6ij/Z3O9neMdqOsqaLMOxKKXPUU4K/d53oBwDsrH70xeJTuGtETU3IB5z168fAVPeemeM+5Dt0AUJg/PRq5Ji+auDIQ8+Z6p7hoSAvvB/M6m3093P7cD8BFc2hgEF7tWkf3eVgtjQzq8EhCPjoUiYkt1UzlthGAEz27pZTkzpip9XeeONkJ/LY3/7mG8r/TTsmulGhFRd7+tt//b1vPCHDLHc5578xZ+oWWlgstLcffvDp7152ls3AW0HJzNDem4SsDuDIwiFztWmd3t6ltphYe1KdEw8O5N8/QYC7U82YWxPrCowDiegLwsCHTimd4Q13vHet679gbZ7VnvuC/VWs2L6az14L12FDUW1KoAdT6MR4Z0nOm6j3nOhMAUJhfFI2odgAYsdyYCEev3lScPxWIAVlFM/L02JA5JHWMTs3mb5sR1l1XBsIIaNc6QucBILtolicyKN1wxshQJObJJ3+11gdWTAEgoevQNI/dLncCYDtGQWFe5Ozbp/7UASCnzA6l2M0APXjhUv7HFi0o7nq3N3/BQl8eusxxmqfp5zu76XFqV0S/2tEwh+S1TrujztQigzoAww4fITCfJyFW7QYLgs5JINjWGfOv+OzKygq/f+m6urvLc0ZisbNdPXkL76tf4i8NVN7TtHnHlpVlHgAgsZ6+6Oyqmtsr/NWrnt7SuER6tzkZGoiMlt3+ibvKSwP+ZbVVRZ78kqoZN5mJA/1hzK6o9lXVrVwR0IBEIq6V/NOd83wlvuX3LffHznX0jCJ2MRSZ7vfP0jAld/b8qtlTWGenuvAu5Zuxs8GLeXfdV7/EVxqovKepacfWlaUaAGj+ZZ9Z7isNVK5ouL0odLZLXCsYgIFLnaFw8aL6VdW3+csWrH5026719xYD5bVf2rFhVU3Zrb6SeTWL5s2KXR6Mjwa7gvHyux9cVhUo8dfU/9vOJx6pyadczzQEQF/vJW3ugqWBkrl1j35j+9236qGzQa2y4f6ld5T8/R2LG7c9uW1D5U2KpnZ3hjyBRXeVaYA20zfbioeWf4uvpHROgQdaYXFxqW92gTBQzItujBvtuxUudYYixYsbVlf7/OVmS+8pNlP4m0xGgsFz8fKaB5dVBUrm1tRv3Pnkuhr+tlu6yX29l7LnLlgaKPHXPfrE9rtvhVb9SNPXN9xd5S8pDVTffVd51uClfjlL0gcH4zMCi6sDZRXVd96zcLZWNNtX5i2obdy25bMfry4p8fkX1FbegrC5NtP8yz693F8aqKxtuL0o1NUVRX9nd3iO2Sg3fHprZzC38p/X3On3lcyr/dzmXRs/HdAAINrTG51dVVNd4au+f8eWNUu80Mo/vWXLFx+qrigrqVi4bHHAe6Xv0qjFNOiLJAbQ09kVq1iyrDTXgDa9orgAAPRuK6bVxRXVi9ZsfWLb+sqpiphaEWLdF+ro0n3LGpb7SgO3r6yrvCkYDOoAMBrquez1L1paVlZd9+Vd65YWy7X1d3RHihc3rL7d5y9bsPrz275rxVSUkWDXuXhFzYPLqgLFc5fXb9z5xLrlZkwv9fbqc+Yvmecv+9j6r259yK+5FtK9Ijw4lH/bXYvmBop9S2oXlmnTZpbPKZRzlr7Xmn8brfz8rl0v7H9q7fycUcAep3U2+Djj1KDHtfnrUmcoUryoYXW1z1d+5+pHv7Fr/T1zAAIS7emNzg4sr67w3Xrnp7LdMhZ0U+/ateg6MfS3D+0ua3yg4fNbc3G1r+PI7l//IU5w+MChOffXbti0QtPDobZXnm8+Z265xzte33/msYfWbqtFOPjWT9quSm/cuXKi+VfzG+/d1PRJTR8Kdbx7esai9XV//J89LToQbT96pGfd6k2Ves/p/W+hreOV5197aN3KjU/nT4lHgicOvPJOAiB/bj70btNn/n1ffZYeG9I19Er5YDIRsfCi2aj1m1Z4EuFQ6ys/OHxOhx9Ej2rlazYszcVQqO1Xu4+GON32tDfa2rz30IwHahs3N2iJwe5Tu3/8mxCA4weP+B9e1/RxDcPRnnNHD736dgI4c+iHbz286r7HtnunRPv/fOJn+49GTD7Iwbd5OHDsyJH5jQ3bt2RH+1tfOtKDcM/eAxUb6lZtXTxVj11sfeNHe9tlfNAAcOX4oX2BxvodzzV69GhU19AFIKt42Refri0GYKB085Yao//1/3jyQBvsxYT9SVyAecuoHciRtuY9L5stzdYHQ6d2//hoCPCAHfMAgGjLy7tve3i129J9RyNgMJfhm3ZLH9ei/a0vHbkI/cKh5vkb6x7bUa/FowOhzl+9+Lt+eTz11sO/fG993cPba6bial9ry+l44IE1nU07ml+9o7Fh8+NeT2Ko93zriwffiaIc0KPZ5Ws2LPVi6IIZU6Dt13sP3WyGTx9wwndy3+6StQ33N9V6R6IXW1/6aXObDgB6x+v7zzy2pnHrvQgHT/6kNQa967UXT31hXePjdRr08F/ajh44HBpxm0ZDYaL15wff3FT/tT11XqIPRTElBCD85t4DFevtmLYd/9GL7cn4oPB86/CJ5p/4Gz+zbtMnPPpg15mf737LXNaOBN/45THfg480LUEs9M7BjhAgu6d6pO3Xe16++YHatZsbsvWB7lM/3OPsuvASPfPybqb37jtmLlETp5uPLNxY+5UdK/Xejtef77InLELt/gN61+s/P1m2qv5rNV7Ew+dOt4T8dWtWnDvp5qBksP3A17e8WnxzIWKDc+qfWpdIuON04wpPIhxqM8cpZNcWRtqarZjWm0Nyz9ELIIChd7y+v+Wxhxq31v7XL75L5swJTC8qdmt3H6tyznFvSRE3rUywF6GOEcOQFZUfycqqkvhMrg3p7IWltV/mX//0l3IPfvXZM5SraV9Qr41z1/FUDamo6RjFGKPKsdXtKKcaxCxfr3dzPhjxr3/mS7kHv/psS5L9t0xF8J/kPOxU8eQkFkMxMJJ3Ke9t9bWVg+2tfdlzV37uXzxHtm1/Y0Cek3e7pD7uveIAMBS5yNxHbYDec4XNDc07aUSWQthKnMaIHQCOYtk+pLoMnSozgldDCG1IOuM1eb1cNvo3cXcNYOsgbBaDTWI3iNKqViJjLTP2Oszv6DqUkDaVbvSkQMOJFNFNNOqNqxPcCKLqJc55ZxyllqypsxeuWVaXi3Co7eUfvJUUBB1gciGAmWocfCNuMcDlg7SVqimKolwGdcOFm5lijqIH+OUxReUg+6moXTyfNFMKppk0NR2xm8RNPRB6O+eQMeCIq0Xq0TSKZyDW2zqU9tNGjKeeySYix6Edp1o1TEpR+SFllxpnpYRbfUrBjOraQ5G/8A9Es5yOF5fTMdvn7tKf+sCCdIUI2hXuXYoUQiaZJKUfewDXt5inrA0+VVE2SYbkImO0RD0WOHKQbh0MkactTqoj434mc3Lypd7fhBeiODTUeSaf0EOCFrojX98OxNM+etXKEUPWOMl7+UmqCJkZCAGIweQm7h/11geRw7jn+cf4CJ+JrzrJ+40snTbaMm8JnCgR1ss0UohLyIwWwvaMQ+iIcpgolsq4PtrJhK5PFma3o41hlTO5hYu9eIYbXx+RaYSmRWlP5WMWwjmZHo5cD2U7dZZbiO3DKdHQzJUkD/WUn2iLy5v4iuzjJAZI0dCwUNWuQsiREtwzEwHvRWjgZkRx6khdhRzUr/cYol45aFC1isPW+c8B80dkUCtFmBctUW2aTHqviV1/IlqdQqd0hLEjj/0+CWGHcHrYkSKP88Az920HCxxdGkvSr1iWR0KwLdYqWc6p9GWGhgbvMykbIMJYEH/LrbJUSKc1ZGq0ojL3HfLKPqVYWvxNZGsf6QTI7RlNYvfRE76q/17HisayZGIkyyksoU/E5VXJ3ymWxrrIcPPRjwG5MEhlo5SqFBo07xXMoE5YNRK7wuRiSF2RSkQIpj6RxTmGjldaXcIdMw7AihRTViSzrsbcMeVqEXHXENbLH12RxlhcCdL+mvRMELLWTRAFVq1KlANFyJpFJymrcaCQqIewg5hqUxWASyxwJGA/OeqqFXW69cuU2kcUICi+qS1Vm4GwsEds1AflV+l+UWoo4UkEEaItNIpI2XF64oKgVauUunJrfx41P2oiBoTIAkWofoKPABk0hdtDue7KU24ySlIFBMvikpLbysCgyGzsw5S0S8mFCGB/uJpJVBND67whnLF+0k4gNBmVVZ9OSuoilOn0iJBSwjFWmx6bzIynWUV4Ssy+eNvKSNdDGzEeJnoDCxF+GLJUbmHIxWjScEN6ehc3Rq9vRaqTRJ2BSRD5oCNp9uIUiOl820sNrvLTSa8HK1OUtRDKM+5zSCSFn8Yl1PxP35UubhpCzRklChnET1oiMz7o+i/F0oXIBj6dOmlGdLoijYbqpCqAN/TsweE+Pfm/D3OjimikKEBJlpRcJF3hMtrSyeNmleWWnONJpa0jxU0zPBW0K3QwyNVj/U9qfcaRIwD9OlsKCiHsEXGjgK+T2+mQpwmSQc9z1xc0MitnC2kNXO4kWDk5RexQIhPkFg03+i6hoTgUz08QGeQAlx5XKWpkB5zw3U4HPAi7JAKTKp5L0tmZDLLcquK2CTI8kWVW6yKso6gitDsE21I2TSX2/eRcPOiZUrqiFBelTCbmQG2ZUG86BgvHhEs2rP+y7IKlH1FWyO39SbkeN9GQjOL1IREu3mL4J65RnBvHWZFkXczV5ixvmau7soGQhK855Zz/rhKKtvGKzYsnLHMjaionxQ8qr4ShWNpAdUZx7s6U0vCoxuhTQYlkREhOqYfOOEeUOzfQlrpEUeoJjgdwOY2kZSePOPEjrEdUczx3eCN6h1sOv89QzpEIqL2dUrLSDIACQmQcirCbgwo9kmM14SMEhDBMhCBV35EnSRzlBo9ujjEOp1L6FGqkgVPuFCktVkNsxobLV99EmgYBdQmbRJck7JkbXkQgc0TkenjfMeL9EdEJ4kbPhMZb7FWZ+TnLUZe+uWnmtOyjVbNIx1K/lMr4r9OrOJUkk3v5WaQ6SMFiHZvt23vGJESoUqadxi4ldZKwXUXMM+sKEn+K8CWHaBomk9OCyQCC0klBtorgN4Bv0MVvSpE203i/mkzPtBmvO5zvk/Bb5OnUjaT5GfRzHk+w65CPZTbVTnJJk3gPIH/fr1StfZZ6/QPfVn4+kfqSiC85TFfYPkEEjBG3mLk8VIWGYIDMnvRtTMov2UxSt/KZxN44CVmRSHQhBI/OieTuvWFFuqKRHk6ccFCYQb1ZIAAM+gYPYlIvQm2cgSJCzr19LLlDqjCruJyEhvDkjR1prlnETSa8Ijlx4QkdR2TUptOtF4mhUHtyTVTjVM7jx5HEakWNGeCNkl+qpldlS6VkiG6jYnpJlvohEpEoSEEQsj3RyUoGaQKIDyiKhuJ3+mK/Z8HkYO5FYiuOJh5SGcxSNIZRFzLoFabMH/ywSu4zYilks9hvbrCMZDRLqxNPsddz6I4qIE5KEcmQWkWq07R7DOpHyqdgxkUG1TrYNGlLmQMVaoICZ2kl49/mfp9E3Cw1hF7M9yflHvHkEboHTzTc032FW4BjHFVnCa2ASFKctwqyZYkbaOLcKMJe3SX8VWQlNiWxUYanFhqKudjBmAxmGVgndvNdcplS+L1CWo3MGEfYUSHGjqcd6qdplJNN+h0iRU66oxGpa1S2ifhAlxdL3QALZxUfVPrGzpNkivjwixgY1fp3ouFeuv/A/chM7K+B8pHi5jzDTnbQg84g8jznThuruE02Gf7IEcNkPUmeYCSDQka3QpjZPJNxKJkfko8J1kBhCiDCKHNtkzpAsgBLG8dlxqhzSDFAKYZsdBjsIWcp9+N69fDrKRxN4HYDua7jnPxQQ3tSUW33qoRMcGO5fuMYNn4nO9/tTMJaJMPaPiV2CTqLOXqpPITKKV55dbBWZigRShBmjcyAqmtiUmEemxGwNhWaqZQqTsqaKwseEYDDEkP0DaGyG262DISw+ERXyRyCtS4ZdkoBTlqGsM5Q7b9lGJCJEGnzkmQTg3JDgKNjPLcaJVRfGP/eXAYi1j7ObmHtD5pXXdlVLPNWU+YP7g/ioJEARI7Nzg2FbqoJiMxrq6miSZiUZCwwMMAroABbBVAGjbDCbT4pqT4R/ksqgMAlknUaURmxNSmQk8qe2ZwsL8JNc2Lz0qWHdG56V4c+BNvJ0tl2HLsIHThjxWJjRGTk2skZ8iEXLioiw1d1iomwxBF6LqUdex34oFUBO+6IGFUIZ5yxZ2Mii5vS8Uz3DUB8HzWnUFW5O+ztV63KEJU7VkEhHKQRMhGhl49ZaJ8Y/GmhQi7oxIHj9OvKwFTBOola1xEZdjpxOqW1E1lmUIPOEDpP8rq4H7YyZ9o3qOiKBooWsTq4dI4Wcd1mXP3ngxNxOgLVBcbVFzIVQ/h/XSQbQH+/6mvNmUsSEw3mJ+FPiPnTbq77nbxMF4n8QnTskm4hJp9HmxqPD4vJqoGWWvcEdlBmFvsghkI6Io7g5JSWawWHwGIb6Qy0HpUNf5NxiCELCK6rd/8fXWW7iJBLwSEAAAAASUVORK5CYII=) + +## Installation + +Make sure that [ortfodb is installed](/db/getting-started#installation) + +## Usage in editors + +### Neovim + +Add this to your `init.lua`: + +```lua +vim.api.nvim_create_autocmd({'BufEnter', 'BufWinEnter'}, { + pattern = {"description.md", "*.yaml"}, + callback = function(event) + print(string.format("starting ortfols for %s", vim.inspect(event))) + vim.lsp.start { + name = "ortfo", + cmd = {"ortfodb", "-c", "/path/to/your/global/configuration/ortfodb.yaml", "lsp"}, + root_dir = vim.fs.dirname( + vim.fs.find({'ortfodb.yaml'}, { upward = true })[1] + ), + } + end +}) +``` + +### VSCode + +1. Install the [ortfo extension](https://marketplace.visualstudio.com/items?itemName=ortfo.vscode-ortfo) +2. Go to your user settings and set "Ortfo: Global Config Path" diff --git a/go.mod b/go.mod index 203ad13..83e43d3 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/ortfo/db -go 1.20 +go 1.22.2 require ( github.com/EdlinOrg/prominentcolor v1.0.0 @@ -18,6 +18,7 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/mapstructure v1.5.0 github.com/muesli/reflow v0.3.0 + github.com/ortfo/languageserver v0.0.0-20240424205118-090504dc9e39 github.com/plus3it/gorecurcopy v0.0.1 github.com/relvacode/iso8601 v1.4.0 github.com/spf13/cobra v1.8.0 @@ -26,6 +27,7 @@ require ( github.com/tcolgate/mp3 v0.0.0-20170426193717-e79c5a46d300 github.com/xeipuuv/gojsonschema v1.2.0 github.com/zyedidia/generic v1.2.1 + go.uber.org/zap v1.27.0 golang.org/x/term v0.19.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 @@ -78,10 +80,17 @@ require ( github.com/muesli/termenv v0.15.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/segmentio/asm v1.1.3 // indirect + github.com/segmentio/encoding v0.3.4 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect + go.lsp.dev/jsonrpc2 v0.10.0 // indirect + go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 // indirect + go.lsp.dev/protocol v0.12.0 // indirect + go.lsp.dev/uri v0.3.0 // indirect go.opencensus.io v0.24.0 // indirect + go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.22.0 // indirect golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect golang.org/x/sync v0.7.0 // indirect diff --git a/go.sum b/go.sum index dc2adbe..169042a 100644 --- a/go.sum +++ b/go.sum @@ -3,6 +3,7 @@ cdr.dev/slog v1.4.2/go.mod h1:0EkH+GkFNxizNR+GAXUEdUHanxUH5t9zqPILmPM/Vn8= cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= +git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/EdlinOrg/prominentcolor v1.0.0 h1:sQNY8Dtsv3PK3J1LbmrDmtlZm9Y9U8Loi1iZIl4YN3Y= github.com/EdlinOrg/prominentcolor v1.0.0/go.mod h1:mYmDsxfcmBz6izH/SqtSzfsUiZdPNPpPgUPKCZq70KQ= @@ -25,12 +26,15 @@ github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJs github.com/PuerkitoBio/goquery v1.9.1 h1:mTL6XjbJTZdpfL+Gwl5U2h1l9yEkJjhmlTeV9VPW7UI= github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink= +github.com/alecthomas/assert/v2 v2.2.1/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= github.com/alecthomas/chroma/v2 v2.11.1 h1:m9uUtgcdAwgfFNxuqj7AIG75jD2YmL61BBIJWtdzJPs= github.com/alecthomas/chroma/v2 v2.11.1/go.mod h1:4TQu7gdfuPjSh76j78ietmqh9LiurGF0EpseFXdKMBw= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alessio/shellescape v1.4.2 h1:MHPfaU+ddJ0/bYWpgIeUnQUqKrlJ1S7BfEYPM4uEoM0= github.com/alessio/shellescape v1.4.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/anaskhan96/soup v1.2.5 h1:V/FHiusdTrPrdF4iA1YkVxsOpdNcgvqT1hG+YtcZ5hM= @@ -49,6 +53,7 @@ github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0 github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= +github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/catppuccin/go v0.2.0 h1:ktBeIrIP42b/8FGiScP9sgrWOss3lw0Z5SktRoithGA= github.com/catppuccin/go v0.2.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -91,9 +96,11 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/go-fonts/liberation v0.3.1 h1:9RPT2NhUpxQ7ukUvz3jeUckmN42T9D9TpjtQcqK/ceM= +github.com/go-fonts/liberation v0.3.1/go.mod h1:jdJ+cqF+F4SUL2V+qxBth8fvBpBDS7yloUL5Fi8GTGY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= @@ -101,7 +108,9 @@ github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgF github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 h1:NxXI5pTAtpEaU49bpLpQoDsu1zrteW/vxzTz8Cd2UAs= +github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9/go.mod h1:gWuR/CrFDDeVRFQwHPvsv9soJVB/iqymhuZQuJ3a9OM= github.com/go-pdf/fpdf v0.8.0 h1:IJKpdaagnWUeSkUFUjTcSzTppFxmv8ucGQyNPQWxYOQ= +github.com/go-pdf/fpdf v0.8.0/go.mod h1:gfqhcNwXrsd3XYKte9a7vM3smvU/jB4ZRDrmWSxpfdc= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= @@ -128,6 +137,7 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= github.com/google/pprof v0.0.0-20231205033806-a5a03c77bf08 h1:PxlBVtIFHR/mtWk2i0gTEdCz+jBnqiuHNSki0epDbVs= @@ -143,6 +153,7 @@ github.com/gosuri/uilive v0.0.4/go.mod h1:V/epo5LjjlDE5RJUcqx8dbw+zc93y5Ya3yg8tf github.com/gosuri/uiprogress v0.0.1 h1:0kpv/XY/qTmFWl/SkaJykZXrBBzwwadmW8fRb7RJSxw= github.com/gosuri/uiprogress v0.0.1/go.mod h1:C1RTYn4Sc7iEyf6j8ft5dyoZ4212h8G1ol9QQluh5+0= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -171,6 +182,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -229,6 +241,8 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/oliamb/cutter v0.2.2 h1:Lfwkya0HHNU1YLnGv2hTkzHfasrSMkgv4Dn+5rmlk3k= github.com/oliamb/cutter v0.2.2/go.mod h1:4BenG2/4GuRBDbVm/OPahDVqbrOemzpPiG5mi1iryBU= +github.com/ortfo/languageserver v0.0.0-20240424205118-090504dc9e39 h1:QWIrXEiOJDp7OheTOoz/5RIWkMtEAC2V1HZokYJ+JRc= +github.com/ortfo/languageserver v0.0.0-20240424205118-090504dc9e39/go.mod h1:AZwH6gjN6MEspOsd4j/3WYte6mebGx1585KoVcgDZhc= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -245,13 +259,19 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y= github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= +github.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc= +github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg= +github.com/segmentio/encoding v0.3.4 h1:WM4IBnxH8B9TakiM2QD5LyNl9JSndh88QbHqVC+Pauc= +github.com/segmentio/encoding v0.3.4/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= @@ -281,6 +301,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tcolgate/mp3 v0.0.0-20170426193717-e79c5a46d300 h1:XQdibLKagjdevRB6vAjVY4qbSr8rQ610YzTkWcxzxSI= github.com/tcolgate/mp3 v0.0.0-20170426193717-e79c5a46d300/go.mod h1:FNa/dfN95vAYCNFrIKRrlRo+MBLbwmR9Asa5f2ljmBI= github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= @@ -300,10 +321,23 @@ github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 h1:yHfZ github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594/go.mod h1:U9ihbh+1ZN7fR5Se3daSPoz1CGF9IYtSvWwVQtnzGHU= github.com/zyedidia/generic v1.2.1 h1:Zv5KS/N2m0XZZiuLS82qheRG4X1o5gsWreGb0hR7XDc= github.com/zyedidia/generic v1.2.1/go.mod h1:ly2RBz4mnz1yeuVbQA/VFwGjK3mnHGRj1JuoG336Bis= +go.lsp.dev/jsonrpc2 v0.10.0 h1:Pr/YcXJoEOTMc/b6OTmcR1DPJ3mSWl/SWiU1Cct6VmI= +go.lsp.dev/jsonrpc2 v0.10.0/go.mod h1:fmEzIdXPi/rf6d4uFcayi8HpFP1nBF99ERP1htC72Ac= +go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 h1:hCzQgh6UcwbKgNSRurYWSqh8MufqRRPODRBblutn4TE= +go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2/go.mod h1:gtSHRuYfbCT0qnbLnovpie/WEmqyJ7T4n6VXiFMBtcw= +go.lsp.dev/protocol v0.12.0 h1:tNprUI9klQW5FAFVM4Sa+AbPFuVQByWhP1ttNUAjIWg= +go.lsp.dev/protocol v0.12.0/go.mod h1:Qb11/HgZQ72qQbeyPfJbu3hZBH23s1sr4st8czGeDMQ= +go.lsp.dev/uri v0.3.0 h1:KcZJmh6nFIBeJzTugn5JTU6OOyG0lDOo3R9KwTxTYbo= +go.lsp.dev/uri v0.3.0/go.mod h1:P5sbO1IQR+qySTWOCnhnK7phBx+W3zbLqSMDJNTw88I= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -358,6 +392,7 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -455,3 +490,4 @@ oss.terrastruct.com/d2 v0.6.3/go.mod h1:y6Gs8FK4vEOa6ZrLQQg4t3J2wavOn0TwMQAyXR7/ oss.terrastruct.com/util-go v0.0.0-20231101220827-55b3812542c2 h1:n6y6RoZCgZDchN4gLGlzNRO1Jdf9xOGGqohDBph5BG8= oss.terrastruct.com/util-go v0.0.0-20231101220827-55b3812542c2/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/metadata.go b/metadata.go index 3eb00ec..a452280 100644 --- a/metadata.go +++ b/metadata.go @@ -10,6 +10,7 @@ import ( "sync" "github.com/go-git/go-git/v5/plumbing/format/gitignore" + "github.com/metal3d/go-slugify" "gopkg.in/yaml.v2" ) @@ -48,6 +49,14 @@ func (t Tag) String() string { return t.Singular } +func (t Tag) DisplayName() string { + return t.Plural +} + +func (t Tag) URLFriendlyName() string { + return slugify.Marshal(t.Singular, true) +} + func (t Tag) Detect(ctx *RunContext, workId string, techs []Technology) (bool, error) { for _, tech := range t.DetectConditions.MadeWith { for _, candidate := range techs { @@ -90,6 +99,14 @@ func (t Technology) String() string { return t.Name } +func (t Technology) DisplayName() string { + return t.Name +} + +func (t Technology) URLFriendlyName() string { + return t.Slug +} + func (t Technology) Detect(ctx *RunContext, workId string) (bool, error) { return autodetectData{ Name: t.Slug,