From 565e8f0fb7f72698c445f87056f0723afe49be18 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Wed, 6 Mar 2024 02:31:28 +0100 Subject: [PATCH] draft code for TNEF winmail.dat #1012 --- examples/eml/tnef.eml | 1745 +++++++++++++++++ examples/eml/tnef2.eml | 101 + .../libraries/MailSo/Imap/BodyStructure.php | 1 + .../app/libraries/MailSo/Mail/MailClient.php | 20 +- .../app/libraries/MailSo/Mail/Message.php | 10 + .../libraries/RainLoop/Actions/Messages.php | 23 + .../v/0.0.0/app/libraries/TNEFDecoder/LICENSE | 339 ++++ .../libraries/TNEFDecoder/TNEFAttachment.php | 372 ++++ .../app/libraries/TNEFDecoder/TNEFBuffer.php | 48 + .../app/libraries/TNEFDecoder/TNEFDate.php | 44 + .../app/libraries/TNEFDecoder/TNEFFile.php | 118 ++ .../libraries/TNEFDecoder/TNEFFileBase.php | 52 + .../app/libraries/TNEFDecoder/TNEFFileRTF.php | 111 ++ .../libraries/TNEFDecoder/TNEFMailinfo.php | 109 + .../app/libraries/TNEFDecoder/TNEFvCard.php | 302 +++ .../app/libraries/TNEFDecoder/constants.php | 203 ++ .../app/libraries/TNEFDecoder/functions.php | 96 + .../snappymail/rtf/controlsymbol.php | 9 + .../libraries/snappymail/rtf/controlword.php | 9 + .../app/libraries/snappymail/rtf/document.php | 338 ++++ .../app/libraries/snappymail/rtf/encoding.php | 90 + .../app/libraries/snappymail/rtf/entity.php | 11 + .../app/libraries/snappymail/rtf/fontinfo.php | 79 + .../app/libraries/snappymail/rtf/group.php | 32 + .../snappymail/rtf/groups/colortable.php | 58 + .../snappymail/rtf/groups/destination.php | 7 + .../snappymail/rtf/groups/filetable.php | 7 + .../snappymail/rtf/groups/fonttable.php | 44 + .../snappymail/rtf/groups/generator.php | 7 + .../libraries/snappymail/rtf/groups/info.php | 7 + .../rtf/groups/listoverridetable.php | 7 + .../snappymail/rtf/groups/listtable.php | 7 + .../snappymail/rtf/groups/listtext.php | 7 + .../libraries/snappymail/rtf/groups/pict.php | 68 + .../snappymail/rtf/groups/stylesheet.php | 7 + .../snappymail/rtf/htmlformatter.php | 583 ++++++ .../app/libraries/snappymail/rtf/text.php | 18 + 37 files changed, 5073 insertions(+), 16 deletions(-) create mode 100644 examples/eml/tnef.eml create mode 100644 examples/eml/tnef2.eml create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/LICENSE create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFAttachment.php create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFBuffer.php create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFDate.php create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFile.php create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFileBase.php create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFileRTF.php create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFMailinfo.php create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFvCard.php create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/constants.php create mode 100644 snappymail/v/0.0.0/app/libraries/TNEFDecoder/functions.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/controlsymbol.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/controlword.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/document.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/encoding.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/entity.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/fontinfo.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/group.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/colortable.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/destination.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/filetable.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/fonttable.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/generator.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/info.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/listoverridetable.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/listtable.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/listtext.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/pict.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/stylesheet.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/htmlformatter.php create mode 100644 snappymail/v/0.0.0/app/libraries/snappymail/rtf/text.php diff --git a/examples/eml/tnef.eml b/examples/eml/tnef.eml new file mode 100644 index 000000000..7709e9ada --- /dev/null +++ b/examples/eml/tnef.eml @@ -0,0 +1,1745 @@ +From: Alice +To: Bob +Subject: TNEF test +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="=-2UbcDuksJBAwUNBNW7UD" + +--=-2UbcDuksJBAwUNBNW7UD +Content-Type: text/plain; charset=us-ascii; format=flowed + +Test message body with example TNEF part from +https://github.com/Yeraze/ytnef + +https://github.com/the-djmaze/snappymail/discussions/1012 + +--=-2UbcDuksJBAwUNBNW7UD +Content-Type: application/vnd.ms-tnef +Content-Disposition: attachment; filename=winmail.dat +Content-Transfer-Encoding: base64 + +eJ8+IjMPAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEIgAcAGAAAAElQTS5NaWNy +b3NvZnQgTWFpbC5Ob3RlADEIAQ2ABAACAAAAAgACAAEGgAMADgAAANMHBgARAAoAFwAAAAIAFAEB +A5AGAPAEAAAnAAAACwACAAEAAAALACMAAAAAAAMAJgAAAAAACwApAAAAAAADADYAAAAAAB4AcAAB +AAAABQAAAHRlc3QAAAAAAgFxAAEAAAAWAAAAAcM05HC0gONzLGp+T/KnwUnJ7LwETAAAAgEdDAEA +AAAaAAAAU01UUDpKR0VSTEFOREBTWU5BQ09SLkNPTQAAAAsAAQ4AAAAAQAAGDgDiNFbkNMMBAgEK +DgEAAAAYAAAAAAAAAM/yM912IydOt4pJEsJHoOTCgAAAAwAUDgAAAAALAB8OAQAAAAIBCRABAAAA +2QAAANUAAAC7AQAATFpGdYDK2Y4DAAoAcmNwZzEyNRYyAPgLYG4OEDAzM08B9wKkA+MCAGNoCsBz +sGV0MCAHEwKAfQqA2QjIIDsJYg4wNQm7AoCdEfIqCbAJ8ASQYXQFsRpSDeBoEvERUDUuNIAwLjEx +LjIyD0BJAoBcdgiQd2sLgGTaNAxgYwBQCwNjAEELtaAgQ2FzZBixZhjl+wqiCoRkGJ8X4AFAGacZ +1fMb6gPQNDgaTxuZHa8cDyMaHyAsb2JqFOB0cPhoXCcMASEPIh4L4yK/CyPKEeEAKKAAAAADAN4/ +n04AAAMACVkDAAAAAwBAZQAAAAALABOACCAGAAAAAADAAAAAAAAARgAAAAADhQAAAAAAAAMAFYAI +IAYAAAAAAMAAAAAAAABGAAAAABCFAAAAAAAACwAYgAggBgAAAAAAwAAAAAAAAEYAAAAAFIUAAAAA +AAADABuACCAGAAAAAADAAAAAAAAARgAAAABShQAA45ABAAMAIoAIIAYAAAAAAMAAAAAAAABGAAAA +AAGFAAAAAAAAHgBEgAggBgAAAAAAwAAAAAAAAEYAAAAAVIUAAAEAAAAFAAAAMTAuMAAAAAALAEWA +CCAGAAAAAADAAAAAAAAARgAAAAAGhQAAAAAAAAsASYAIIAYAAAAAAMAAAAAAAABGAAAAAA6FAAAA +AAAAAwBMgAggBgAAAAAAwAAAAAAAAEYAAAAAGIUAAAAAAAALAGGACCAGAAAAAADAAAAAAAAARgAA +AACChQAAAAAAAAIB+A8BAAAAEAAAAM/yM912IydOt4pJEsJHoOQCAfoPAQAAABAAAADP8jPddiMn +TreKSRLCR6DkAgH7DwEAAACWAAAAAAAAADihuxAF5RAaobsIACsqVsIAAG1zcHN0LmRsbAAAAAAA +TklUQfm/uAEAqgA32W4AAABDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXGpnZXJsYW5kXExvY2Fs +IFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcTWljcm9zb2Z0XE91dGxvb2tcT3V0bG9vay5wc3QA +AAADAP4PBQAAAAMADTT9NwIAAgEUNAEAAAAQAAAATklUQfm/uAEAqgA32W4AAAIBfwABAAAAMQAA +ADAwMDAwMDAwQ0ZGMjMzREQ3NjIzMjc0RUI3OEE0OTEyQzI0N0EwRTQ2NDUzMjcwMAAAAAADAAYQ +ONf/MwMABxBaAAAAAwAQEAAAAAADABEQAAAAAB4ACBABAAAAWwAAAENBU0RBU0RGQVNERkFTRENB +U0RBU0RGQVNERkFTRENBU0RBU0RGQVNERkFTRENBU0RBU0RGQVNERkFTRENBU0RBU0RGQVNERkFT +RENBU0RBU0RGQVNERkFTRAAASAICApAGAA4AAAABAF0AAAAgACAAAAAAAJ4AAhOAAwAOAAAA0wcE +AAcACgAjACYAAQA5AQIPgAYAeQsAAP/Y/+AAEEpGSUYAAQIAAGQAZAAA/+wAEUR1Y2t5AAEABAAA +ADwAAP/uACZBZG9iZQBkwAAAAAEDABUEAwYKDQAAA4gAAAVMAAAH5wAAC3f/2wCEAAYEBAQFBAYF +BQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwODxAPDgwTExQUExMcGxsbHB8fHx8fHx8fHx8B +BwcHDQwNGBAQGBoVERUaHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fH//CABEIAEgAUwMBEQACEQEDEQH/xADFAAABBQEBAQAAAAAAAAAAAAAGAgMEBQcBAAgB +AQEBAQAAAAAAAAAAAAAAAAEAAgMQAAEEAgEDAwMFAAAAAAAAAAMAAQIEEQUTECESMEAGICIUUDFB +JBURAAECAwUFBQYHAQAAAAAAAAECAwARIRAxQVESYSIyEwQgcZGx0fCBocFCUuFicoIjMxRTEgEA +AAAAAAAAAAAAAAAAAABgEwEAAgIBBAEDBQEBAQAAAAABABEhMUEQUWFxIIGRoTDwscHRQPHh/9oA +DAMBAAIRAxEAAAHUy+bN5jqqE0mu0TY2f435k0cvPCdA43GdJNdTlPFsPLs21LrmDaK6nZlE7L1U +esSxOMdLcSbXPGUh2r0aTRZZiU1nPTkqppohxuS5BtYKDZTjSKdqvbPunLtKGTOuZsV0E+daPjcK +mGoNANrl5exyt4xrB9C5IMo/rNuauDQhrmhHJSGm51mWi/GpZFXxqtiGkZy4Pk37GsnYskEs1S2p +r1QHMWPR6v/aAAgBAQABBQJEG4yZ6ZT/ALrQGaF9p+Sy679N9X4dvheOV44bMGXnhPOToEDSNN2y +thc+UVjXthYuF+91EBpv+C8YhBWnK7TiMSr2CglT2fMuSK2O1rUY7LZ2dgSJXE4354PApDVZldWq +0Xpd8ePesTwl/oQW8fjuqtVc9PQ0uKFrVDIq9OAltDf1+kZYXLNfJAVzUVorXiaplWijYsWzG232 +p0/TclgCgg8vIffW3nMsyS112YbN80WrOyz2j3bK+XWDssPJ9f8AhRJUj5prJmX4g5scrnIZsOov +FZWw1lS/G9qC1thqPj5xm29RqOylOLuOXPCMMI7sv5x0/9oACAECAAEFAvrf9If0n9THvv/aAAgB +AwABBQL629nj37epn33/2gAIAQICBj8CR//aAAgBAwIGPwJH/9oACAEBAQY/AoW2b0KUk+4xXsyU +ZJW2pNfEeUUIJyBHl2OoGCzzB+/8bchnGcboA9tsSUYQjpwecT/HpvnGZz22LoVNT3VtNhSZeBI9 +8BzqauITpu00vrFE2TWrSI0pcClfaflHNAlLiFmptWk4y8oSFy3py7xZvzW8r+tlPEfQRrekEjgb +TcPWJKbE8sYJ6dFfnATLmOTuPDA19O2tonSdyRELThppZWKjUMo4/pl7bY6wOibiylTRP2FMqdxs +DiRrK914E/8AM0IPdDylJkokS7oCtakLF2UTUorVnfCwjAV7GHdKFTcbQ+2NaNZEyMUjvsV06uF2 +qf1D1EOQGy4ErN6ThBlhfCxhbP4WdQ7ytalIKCZDGgmcqxLKAtuikHUDtETYPKQfplBUolSlGc9s +aXCeWvdXPxBic+O62WNjPTgyYcBUraUmgjzhf+tvU082rlk/SoD5wUym4U7gOJii5ZSEJ6l1WAOn +CKf1p4RZW+z4wlPUJO5wKSZETj/KxN4OCbVL/wApN1IS91spNT5TIrfnDrTdEAhbWwGvwjUWwSb5 +GnhAGqo4kemfa//aAAgBAQMBPyGB/wDdpiYPh4l5995kOd6/yJ0zBrN48yjh6VReNmNxdQ9zD9jL +0xa8E9emC8fjwLf5Ryta8PeCOM+YZin1H8XHCzTxX+sqK5DVvq4NyDt65qUfHMx5rNVtZs65hppS +/Vn0/wDIU0Ke2b+UinyouTJoDyzQgfT/AHM2DX2mM68tB+YKsTCVf4TKlQD5xKxL92w8FO57d4tT +bQKorrGEZ5/MPFBXLp5/sYNVPExvnarlg9rZagP6juPP12Keo1Ey2lq0d467X1GBxpxG6tNmarJb +DY7gislZaFOmHDT3mDa/zXv6JgzQ26+/u/M4rxUqLDCG+5ELi7Mex7xvnqG9u0BdR3cDx2l7OKOT +5ldpTZYhwsoc7u9V5mKvfB3u/wC4UY3IBmxnX7x1f/sL+jGZP2ajGerM+jXuZhEcEmI90GgMk56g +ZnhzLX2Ibwj/AGVcaEQzmrB03GzDwv1zKFaZPGQPrUQ98oc92/xM9ehn29wUECP8h5IiN9Pqldeo +ug5r+ISr3VNN8S5iovHWc4UYYQvlcY7y9BlKuwErwo7Q1Sb4YZr3RidrpoFeu0LKrZ3DM4iw8Hv/ +ACJm43NeSCb+iS3Z/bUfgWqmuaTvXMZYeNltdmq1LXtS1KyiWAFG62Vlxy77R62qe8EHvgi1BXYF +7ipe4UKrSOEV541UQ+bySmt58zA1Yv1l/wCT/9oACAECAwE/If1J8a6PwrrcuD0SV1D9BlfFfQ+J +8h+kSHxOjHpf/D//2gAIAQMDAT8h/wCHfQ+VdAROg18Fl9GHwJfwOr/xDpuDH51CWyox/Tfh/9oA +DAMBAAIRAxEAABDOG35hJ6NEvj17pF1n4jw0Mup+UtFeJTgk7XkIj+sSuX0GdBkN/wD/2gAIAQED +AT8QDvZjVyvJxHTU/EK9kvg4cFw3JTla7dt5hyFsXHjD4fzEDC2EzxGrYNthwGC2We6WajMS2i+5 +VpmXUmMLjvernvq/2e4UVR6YtqX7l/Q+CUVb0f4uUgrsHw8SkoRu2X02Eawx1QGni4ACi8sTyzfi +JkPpavLRiLwYEAthyDxAXczII1SDejLElH3ap/pCq5vAttLMMDldKUwI8IqoQMyLnHqDnPUGj6pv +FMacLuj2CKzEDsjuvxH8CiS/Gv7wTpHApcM5udi07PMBC/Bh6o2Pgb5jZh9myAKh5oqYrtdd9dr9 +f3HN5agMjVhnzVaVGq4QNbsXwWnoCUksbgS6Nq7wjEFGhwXwHtVymG4ogrsThW8s3uZAYXDfpdWQ +4BFVbmgzTFbRQp4u+JlRTSPsvcGNY5LIYKJkzPv4Xn9guVqaY6Ljtiii8nMaWEdhvHqOQNrB2iER +dQdIFpDOMr3ywA3UxCpNcZ5lfnYfkOhRWKICBXBrTSxFFGzIubAxiaDDWBv94jeo5TNWnid/zS96 +/SMgxQf3iDwoaB3hs0SgwgC8xt0PI1X7ccxjDRRp7T21EHffU2GHC9mKzDV7u3ORNSpABW1Rdt+Z +d6yFS9Uf1MNFwINntmZZRV8fYyjzWGufvHuSrgNipHwvsIKBWl+bSn7oSphbi7XtTzH7qXIX9MjZ +4RpTLilbG4Sj8aVilgiVfWp3YwYtWP8A5CzWcPTKAVVCv5f1MMMGt27qpxWrlfm+0WN+gUpRw2Cr +p4mWRHMw2vsvvCQms2bkl0nKu8KT5EOQG/OtuklpxQUXeh9xM3Yo0gMs3CoKlDCxkn4hBllwul4i +jady/wAe/EIWFr0OU/yYee8LdSp5HIE0igLAmIDdY2RIXsFFqCZAZLQW1E4iuBoFlBlCaccc7Utw +F8xq1FRXaNhbwNRxEKlh/QLzxF+bcQL+vaKArcPGctxqL4YTx7lrP6I5lO+a4P3+3M//2gAIAQID +AT8Qh8tPjp81az1AhTopKxp1LI06BKJUqt9E8wc9R0G+i0xZhK3Nur0XQcxg/oCOoF3KqYviuDpb +iKVMMQhno9BqDFhnprofD//aAAgBAwMBPxCMPjt8WV1a6LZa8db8RRmWXnmwZj64R62amEG5a56R +LOr6Bo89AEhqVC5p1GpZK6Pjq9GMWY6MLcaai2d6YkfhcqHVm2WK4eh1IvSyDZKj+H//2cjwAhCA +AQANAAAAWkFQUEFffjIuSlBHAJoDAhGABgC4DQAAAQAJAAAD3AYAAAAAIQYAAAAABQAAAAkCAAAA +AAUAAAABAv///wClAAAAQQvGAIgAIAAgAAAAAAAgACAAAAAAACgAAAAgAAAAQAAAAAEAAQAAAAAA +AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/AAAAHwAAAB8AAA +AfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB +8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAA/AAAAPwAAAH8AAAD/AAAf8h +BgAAQQtGAGYAIAAgAAAAAAAgACAAAAAAACgAAAAgAAAAIAAAAAEAGAAAAAAAAAwAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDA +wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD////////////////////////AwMDAwMDAwMDAwMDA +wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAADAwMD////////////////////////////////////AwMDAwMDAwMDAwMDAwMDAwMDAwMDA +wMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD///////////// +///////////////////////////AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD///////////////////////////////////// +///////AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAADAwMD////////AwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDAwMDAwMDA +wMCAgICAgIDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD////////A +wMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDAwMDAwMDAwMDAwMCAgICAgIDAwMDAwMDA +wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD////////AwMCAgICAgICAgICAgICAgICA +gICAgICAgIDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAADAwMD////////AwMCAgICAgICAgICAgICAgICAgICAgIDAwMDAwMDAwMDAwMDA +wMDAwMCAgICAgICAgIDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD///// +///AwMCAgICAgICAgICAgICAgICAgICAgICAgIDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAwMDA +wMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD////////AwMCAgICAgICAgIAAgICA +gICAgICAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAwMDAwMDAwMAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAADAwMD////////AwMCAgICAgICAgIAAgICAgICAgICAgICAgIDAwMDAwMDA +wMDAwMDAwMDAwMCAgICAgIDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD/ +///////AwMCAgICAgIAAgIAAAIAAgICAgICAgICAgIDAwMDAwMDAwMDAwMDAwMCAgICAgICAgIDA +wMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD////////AwMCAgICAgIAAAIAA +gICAgICAgICAgICAgIDAwMDAwMDAwMDAwMDAwMCAgICAgICAgID////AwMDAwMAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAADAwMD////////AwMCAgICAgIAAAIAAgICAgIAA//8A//8A//8A//8A +///AwMAA//8A//+AgICAgICAgID////AwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA +wMD///////8AAIAAAIAAAIAAAIAAgIAAAIAAAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP+A +gID////AwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD///////8AAIAAAIAAAIAA +AIAAAIAAAIAAAIAAAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP+AgID////AwMDAwMAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAADAwMD///////+AgIAAAP8AgIAAgIAAAP8A//8A//8AgIAAgICA +gIDAwMDAwMDAwMAA//8AAP8AAP+AgID////AwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AADAwMD///////+AgIAAAP8AgIAAgIAAAP8A//8A//8A//8A//8A///AwMD////AwMDAwMDAwMAA +//+AgID////AwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD///////+AgIAAAP8A +gIAAAP8AAP8A//8A//8A//8A//8A///AwMDAwMDAwMAA//8A//8A//+AgID////AwMDAwMAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD////////AwMAAAP8AAP8AAP8AAP8AAP8A//8A//8A +///AwMAA///AwMDAwMDAwMAA//8A//+AgID////AwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAADAwMD///////////+AgICAgICAgICAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA +wMDAwMD////////AwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD///////////// +///////////////////////////////////////////////////////AwMDAwMDAwMDAwMDAwMAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD///////////////////////////////////// +///////////////////////////////AwMDAwMDAwMDAwMCAgIAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAADAwMD///////////////////////////////////////////////////////////// +///AwMD//wCAgACAgACAgACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMD///////// +///////////////////////////////////////////////////////AwMDAwMD//wD//wCAgIAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////// +///////////////////////////////AwMDAwMD//wCAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAD///////////////////////////////////////////////////////////// +///////AwMDAwMCAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// +///////////////////////////////////////////////////////////AwMDAwMAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA +wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAADAAAAAADg9wIFkAYAmAEAABIAAAADACAOlBkAAB4AATABAAAADgAAAHphcHBhX2F2MS5qcGcA +AAACAQI3AQAAAAAAAAAeAAM3AQAAAAUAAAAuanBnAAAAAAMABTcBAAAAHgAHNwEAAAAOAAAAemFw +cGFfYXYxLmpwZwAAAAMACzddAAAAAwAUNwAAAAADAPp/AAAAAEAA+38AQN2jV0WzDEAA/H8AQN2j +V0WzDAMA/X8AAAAACwD+fwAAAAADACEOJckDAAIB+A8BAAAAEAAAAM/yM912IydOt4pJEsJHoOQC +AfoPAQAAABAAAADP8jPddiMnTreKSRLCR6DkAgH7DwEAAACWAAAAAAAAADihuxAF5RAaobsIACsq +VsIAAG1zcHN0LmRsbAAAAAAATklUQfm/uAEAqgA32W4AAABDOlxEb2N1bWVudHMgYW5kIFNldHRp +bmdzXGpnZXJsYW5kXExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcTWljcm9zb2Z0XE91 +dGxvb2tcT3V0bG9vay5wc3QAAAADAP4PBwAAAFdnAgKQBgAOAAAAAQBzAAAAIAAgAAAAAAC0AAIT +gAMADgAAANMHBgARAAoAFgApAAIAPAECEYAGALgNAAABAAkAAAPcBgAAAAAhBgAAAAAFAAAACQIA +AAAABQAAAAEC////AKUAAABBC8YAiAAgACAAAAAAACAAIAAAAAAAKAAAACAAAABAAAAAAQABAAAA +AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAH4AAAB+AAAAfg +AAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA +AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAA/gAAAf4AAAP+AAAH/gAAD/4AAB +/yEGAABBC0YAZgAgACAAAAAAACAAIAAAAAAAKAAAACAAAAAgAAAAAQAYAAAAAAAADAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV +VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAAAAAAAAA +AIaGhtbn58zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM +zMzMzMzMzMzMzMzMzMzMzMzMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/////////////// +/////////////////////////////////////////////////////////////////////////8zM +zFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/////////////////////////////////////// +/////////////////////////////////////////////////8zMzFVVVQAAAAAAAAAAAAAAAAAA +AAAAAIaGhtbn5/////////////////////////////////////////////////////////////// +/////////////////////////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/////////// +//////////////////////////////////////////////////////////////////////////// +/8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/////////////////////////////////// +/////////////////////////////////////////////////////8zMzFVVVQAAAAAAAAAAAAAA +AAAAAAAAAIaGhtbn5////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM +DAwMDAwMDAwMDAwMDAwMDP///////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/////// +/4aGhszMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzAwMDP// +/////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5////////4aGhtbn59bn59bn59bn59bn +59bn59bn59bn59bn59bn59bn59bn59bn59bn59bn58zMzAwMDP///////8zMzE1NTQAAAAAAAAAA +AAAAAAAAAAAAAIaGhtbn5////////4aGhtbn5/////////////////////////////////////// +/////////////9bn58zMzAwMDP///////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/// +/////4aGhtbn5////4aGhoaGhoaGhv///4aGhoaGhoaGhv///4aGhoaGhoaGhv///9bn58zMzAwM +DP///////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5////////4aGhtbn5/////////// +/////////////////////////////////////////9bn58zMzAwMDP///////8zMzFVVVQAAAAAA +AAAAAAAAAAAAAAAAAIaGhtbn5////////4aGhtbn5////8zMzAAAgP///////8zMzIAAgIAAgP// +/wCAAACAAACAAP///9bn58zMzAwMDP///////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn +5////////4aGhtbn5////wAAgAAA/wAAgP////8AAP8AAMzMzP///wCAAAD/AP8AAP///9bn58zM +zAwMDP///////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5////////4aGhtbn5////wAA +/wD//wAAgP//////AP8AAP8AAP///////wCAAACAAP///9bn58zMzAwMDP///////8zMzFVVVQAA +AAAAAAAAAAAAAAAAAAAAAIaGhtbn5////////4aGhtbn5////////wAA/wAAgP////8AAP////// +/////////wCAAP///////9bn58zMzAwMDP///////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaG +htbn5////////4aGhtbn5////////////////////////////////////////////////////9bn +58zMzAwMDP///////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5////////4aGhtbn5/// +/////////////////////////////////////////////////9bn58zMzAwMDP///////8zMzFVV +VQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5////////4aGhtbn59bn59bn59bn59bn59bn59bn59bn +59bn59bn59bn59bn59bn59bn59bn58zMzAwMDP///////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAA +AIaGhtbn5////////4aGhszMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM +zMzMzMzMzAwMDP///////8zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5////////4aGhjOZ +zJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAIAAAIAAAIAAAIAAAIAAAIAAAAwMDP///9bn58zM +zFVVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5////////4aGhjPM/5kAAJkAAJkAAJkAAJkAAJkA +AJkAAJkAAJkAAP///4AAAP///4AAAP///4AAAAwMDNbn58zMzJmZmVVVVQAAAAAAAAAAAAAAAAAA +AAAAAIaGhtbn5////////4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaG +hoaGhoaGhoaGhgwMDMzMzJmZmXd3d1VVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/////////// +/////////////////////////////////////////////////////////////9bn58zMzJmZmXd3 +d3d3d1VVVQAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/////////////////////////////////// +/////////////////////////////////5mZmU1NTU1NTTMzMzMzMzMzMzMzMwAAAAAAAAAAAAAA +AAAAAAAAAIaGhtbn5/////////////////////////////////////////////////////////// +/////////5mZmf///////9bn58zMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/////// +/////////////////////////////////////////////////////////////5mZmf///9bn58zM +zFVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn5/////////////////////////////// +/////////////////////////////////////5mZmdbn58zMzFVVVQAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAIaGhtbn5/////////////////////////////////////////////////////// +/////////////5mZmczMzFVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIaGhtbn59bn +59bn59bn59bn59bn59bn59bn59bn59bn59bn59bn59bn59bn59bn59bn59bn59bn55mZmVVVVQAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaG +hoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhpmZmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAMAAAAAACFfAg+ABgAtTwEAPCFET0NUWVBFIE5FVFNDQVBFLUJvb2ttYXJrLWZpbGUtMT4N +CjwhLS0gVGhpcyBpcyBhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLg0KSXQgd2lsbCBi +ZSByZWFkIGFuZCBvdmVyd3JpdHRlbi4NCkRvIE5vdCBFZGl0ISAtLT4NCjxUSVRMRT5Cb29rbWFy +a3M8L1RJVExFPg0KPEgxPkJvb2ttYXJrczwvSDE+DQo8REw+PHA+DQogICAgPERUPjxIMyBGT0xE +RUQgQUREX0RBVEU9IjEwNDI2NDY4NzQiPkFkb2JlIEdvTGl2ZTwvSDM+DQogICAgPERMPjxwPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5ydWR5bGVtY2tlLmNvbS9BY3Rpb25zLyIg +QUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzQiPkdvTGl2ZSBBY3Rpb25zIFJlc291cmNlPC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL3d3dy5tYXR0LXJpZGxleS5jb20vc29mdHdhcmUvYWN0aW9ucy9hY3Rp +b25zLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBM +QVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5Hb0xpdmUgQWN0aW9uczwvQT4NCiAgICAgICAgPERU +PjxBIEhSRUY9Imh0dHA6Ly93d3cuZ29saXZlaHEuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkdvTGl2 +ZSBIZWFkcXVhcnRlcnMgIE5ld3M8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3 +LmdvbGl2ZWhlYXZlbi5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0 +ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+R29MaXZlSGVhdmVuICBBIEh1YiBm +b3IgdGhlIEdvTGl2ZSBDb21tdW5pdHk8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8v +MjE2LjI0Ni41MS4yMDIvZm9ydW1zL2Fkb2JlX2dvbGl2ZS9pbmRleC5odG0iIEFERF9EQVRFPSIx +MDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2 +ODc0Ij5odHRwLS0yMTYuMjQ2LjUxLjIwMi1mb3J1bXMtYWRvYmVfZ29saXZlLWluZGV4Lmh0bTwv +QT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cud2JsYWR5LmNvbS9hY3Rpb25zLmh0 +bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01P +RElGSUVEPSIxMDQyNjQ2ODc0Ij5Nb3JlIEFkb2JlIEdvTGl2ZSBBY3Rpb25zIHBhZ2Ugb25lPC9B +Pg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5vdXQudG8vYWN0aW9ucy9odG1sL2lu +ZGV4Lmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBM +QVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5PVVRhY3Rpb25zPC9BPg0KICAgIDwvREw+PHA+DQog +ICAgPERUPjxIMyBGT0xERUQgQUREX0RBVEU9IjEwNDI2NDY4NzQiPkFTUCBTdHVmZjwvSDM+DQog +ICAgPERMPjxwPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5hc3BzdHJlZXQuY29t +L2QudGFmIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MiIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+QVNQIC0gQXBwbGljYXRpb24gc2VydmljZSBwcm92aWRl +cnM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmNybXhjaGFuZ2UuY29tLyIg +QUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzQiPkNSTVhjaGFuZ2UgR2F0ZXdheSB0byB0aGUgQ29udGFjdCBDZW50ZXIs +IENSTSBhbmQgQ3VzdG9tZXIgQ2FyZSBDb21tdW5pdHk8L0E+DQogICAgICAgIDxEVD48QSBIUkVG +PSJodHRwOi8vd3d3LnBlb3BsZXNvZnQuY29tL2VuL3VzL3Byb2R1Y3RzL2FwcGxpY2F0aW9ucy9j +cm0vcHJvZHVjdF9jb250ZW50Lmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lU +PSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5QZW9wbGVTb2Z0ICBDdXN0 +b21lciBSZWxhdGlvbnNoaXAgTWFuYWdlbWVudCAgSG9tZTwvQT4NCiAgICA8L0RMPjxwPg0KICAg +IDxEVD48SDMgRk9MREVEIEFERF9EQVRFPSIxMDQyNjQ2ODc0Ij5EYWlseTwvSDM+DQogICAgPERM +PjxwPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2FudHdycC5nc2ZjLm5hc2EuZ292L2Fw +b2QvYXJjaGl2ZXBpeC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0 +ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+QXN0cm9ub215IFBpY3R1cmUgb2Yg +dGhlIERheSBBcmNoaXZlPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5mYWly +dnVlLmNvbS8/ZmVhdHVyZT1hd2FyZHMyMDAxIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+QmVzdCBvZiB0aGUg +QmxvZ3M8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmJyaWxsc2NvbnRlbnQu +Y29tL2luZGV4Lmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5CcmlsbCdzIENvbnRlbnQ8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmNhbXdvcmxkLmNvbS8iIEFERF9EQVRFPSIxMDQy +NjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0 +Ij5DYW1Xb3JsZCBUaGlua2luZyBPdXRzaWRlIHRoZSBCb3g8L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vd3d3LmNodWQuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklT +SVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkNIVUQgLSBDaW5lbWF0 +aWMgSGFwcGVuaW5ncyBVbmRlciBEZXZlbG9wbWVudDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9 +Imh0dHA6Ly93d3cuZGF5cG9wLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lU +PSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5EYXlwb3AgLSBhIGN1cnJl +bnQgZXZlbnRzLXdlYmxvZy1uZXdzIHNlYXJjaCBlbmdpbmU8L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vd3d3LmRvdGNvbXNjb29wLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBM +QVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5Eb3Rjb20g +U2Nvb3A8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmRvdGN1bHQuY29tLyIg +QUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzQiPmRvdENVTFQuY29tPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0 +cDovL2RyZXcuY29ycnVwdC5uZXQvIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+ZHJldyMjXiM8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmZhcmsuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4 +NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkZB +UksgRHJldyBDdXJ0aXMnIEZBUksuY29tPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDov +L3d3dy5mZWVkbWFnLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4 +MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5GRUVEIE1hZ2F6aW5lPC9BPg0KICAg +ICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5lbGVnYW50aGFjay5jb20vaW5kZXguaHRtbCIg +QUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzQiPklBIEVILiBFbGVnYW50aGFjayBpcyBhIGd1aWRlIHRvIEluZm9ybWF0 +aW9uIEFyY2hpdGVjdHVyZSwgSW50ZXJmYWNlIERlc2lnbiwgVXNhYmlsaXR5LCBVc2VyIENlPC9B +Pg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5pcm9ubWluZHMuY29tL2luZGV4LnNo +dG1sIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MiIgTEFTVF9N +T0RJRklFRD0iMTA0MjY0Njg3NCI+SXJvbm1pbmRzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0i +aHR0cDovL3d3dy5tZW1lcG9vbC5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJ +VD0iMTA0ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+bWVtZXBvb2wuY29tPC9B +Pg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5tZXRhZmlsdGVyLmNvbS8iIEFERF9E +QVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIx +MDQyNjQ2ODc0Ij5NZXRhZmlsdGVyICBDb21tdW5pdHkgV2VibG9nPC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL3d3dy5tcmJhcnJldHQuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPm1yYmFy +cmV0dC5jb208L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnBsYXN0aWMuY29t +LyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzQiPlBsYXN0aWM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vd3d3LnNhbG9uLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4 +MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5TYWxvbi5jb208L0E+DQogICAgICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnNoYXJwZXdvcmxkLmNvbS8iIEFERF9EQVRFPSIxMDQy +NjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0 +Ij5TSEFSUEVXT1JMRCAgYW1lcmljYSdzIG5vLiAxIHdlYnNpdGU8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vd3d3LnNsYXNoZG90Lm9yZy8iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBM +QVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5TbGFzaGRv +dCBOZXdzIGZvciBuZXJkcywgc3R1ZmYgdGhhdCBtYXR0ZXJzPC9BPg0KICAgICAgICA8RFQ+PEEg +SFJFRj0iaHR0cDovL3d3dy5zdWNrLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5TdWNrLmNvbSBEYWls +eTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cudGFsa2hhcmRvbmxpbmUuY29t +L2luZGV4LnBocCIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPlRhbGsgSGFyZCBPbmxpbmUgRm9ydW1zPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy50aGVtb3JuaW5nbmV3cy5vcmcvIiBBRERf +REFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NCI+VGhlIE1vcm5pbmcgTmV3czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0 +dHA6Ly93d3cudGhlc3RhbmRhcmQuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklT +SVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPlRoZVN0YW5kYXJkLmNv +bSBob21lcGFnZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cud2lyZWQuY29t +LyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzQiPldpcmVkIE5ld3M8L0E+DQogICAgPC9ETD48cD4NCiAgICA8RFQ+ +PEgzIEZPTERFRCBBRERfREFURT0iMTA0MTI2NTc4MyI+RGVsbDwvSDM+DQogICAgPERMPjxwPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5kZWxsYXVjdGlvbi5jb20iIEFERF9EQVRF +PSIxMDQxMjY1NzkyIiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQw +MjU2NzE4Ij5EZWxsIEF1Y3Rpb248L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3 +LmRlbGwuY29tLyIgQUREX0RBVEU9IjEwNDEyNjU3OTIiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIi +IExBU1RfTU9ESUZJRUQ9IjEwNDAyNTY3MTgiPkRlbGw8L0E+DQogICAgICAgIDxEVD48QSBIUkVG +PSJodHRwOi8vd3d3LmRlbGxuZXQuY29tLyIgQUREX0RBVEU9IjEwNDEyNjU3OTIiIExBU1RfVklT +SVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDAyNTY3MTgiPkRlbGxuZXQ8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmdpZ2FidXlzLmNvbS8iIEFERF9EQVRFPSIx +MDQxMjY1NzkyIiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQwMjU2 +NzE4Ij5HaWdhYnV5czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9zdXBwb3J0LmRl +bGwuY29tIiBBRERfREFURT0iMTA0MTI2NTc5MiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MiIgTEFT +VF9NT0RJRklFRD0iMTA0MDI1NjcxOCI+U3VwcG9ydC5EZWxsLmNvbTwvQT4NCiAgICA8L0RMPjxw +Pg0KICAgIDxEVD48SDMgRk9MREVEIEFERF9EQVRFPSIxMDQyNjQ2ODc0Ij5lWmluZXM8L0gzPg0K +ICAgIDxETD48cD4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9hYW4ub3JnL2diYXNlL0Fh +bi9pbmRleCIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExB +U1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkFzc29jaWF0aW9uIG9mIEFsdGVybmF0aXZlIE5ld3N3 +ZWVrbGllczwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9sb3N0YXRzZWEubmV0L0xB +Uy9pbmRleDIuaHRtIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+TE9TVCBBVCBTRUEgb25saW5lPC9BPg0KICAg +ICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5tb3RoZXJqb25lcy5jb20vIiBBRERfREFURT0i +MTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0 +Njg3NCI+TW90aGVySm9uZXMuY29tIC0tIE5ld3MgYW5kIFJlc291cmNlcyBmb3IgdGhlIFNrZXB0 +aWNhbCBDaXRpemVuPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5zaGlmdC5j +b20vaW5kZXguYXNwIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+U2hpZnQuY29tPC9BPg0KICAgIDwvREw+PHA+ +DQogICAgPERUPjxIMyBGT0xERUQgQUREX0RBVEU9IjEwNDI2NDY4NzQiPkZpbmFuY2VzPC9IMz4N +CiAgICA8REw+PHA+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vcGVyc29uYWwzMDAuZmlk +ZWxpdHkuY29tL2dlbi9tZmxmaWQvNS8zMTYwNjkzMDEuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4 +NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkZp +ZGVsaXR5IEFzc2V0IE1hbmFnZXIgR3Jvd3RoPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0 +cDovL3d3dy5mb29sLmNvbS9pbmRleC5odG0iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5Gb29sLmNvbSBGaW5h +bmNlIGFuZCBGb2xseSAtLSBNYWluIFBhZ2U8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vd3d3LmZvb2wuY29tL21vbmV5LzQwMWsvNDAxazAwMy5odG0/cmVmPU1URjQwMWsiIEFERF9E +QVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIx +MDQyNjQ2ODc0Ij5Gb29sLmNvbSBJcyBZb3VyIDQwMShrKSBGb29saXNoIC0tIEhvdyB0byBQaWNr +IGEgV2lubmVyPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cHM6Ly9haXMyLnRpYWEtY3Jl +Zi5vcmcvY2dpLWJpbi9XZWJPYmplY3RzL0lBUGFydGljaXBhbnQiIEFERF9EQVRFPSIxMDQyNjQ2 +ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQyIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5J +QVBhcnRpY2lwYW50PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL215ZmlkZWxpdHkz +MDAubWVtYmVycy5maWRlbGl0eS5jb20vbXlGaWRlbGl0eS9pbmRleC5qaHRtbCIgQUREX0RBVEU9 +IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDI2 +NDY4NzQiPk15IEZpZGVsaXR5PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL215LmZv +b2wuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExB +U1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPlRoZSBNb3RsZXkgRm9vbCAtLSBNeSBGb29sPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5mYWJpYW4uY29tLyIgQUREX0RBVEU9IjEw +NDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4 +NzQiPldlbGNvbWUgdG8gTWF2ZXJpY2sgSW52ZXN0aW5nIHdpdGggRG91ZyBGYWJpYW4hPC9BPg0K +ICAgIDwvREw+PHA+DQogICAgPERUPjxIMyBGT0xERUQgQUREX0RBVEU9IjEwNDI2NDY4NzQiPkZv +bnRzPC9IMz4NCiAgICA8REw+PHA+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmRz +ZzQuY29tLzA0L2V4dHJhL2JpdG1hcC9pbmRleC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NCIg +TEFTVF9WSVNJVD0iMTA0ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+MDQgIGV4 +dHJhICBiaXRtYXA8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LjEwMDFmb250 +cy5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MiIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+MTAwMSBGb250cyAuY29tPC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL3d3dy5ibGFtYm90LmNvbS90aXRsZS5odG1sIiBBRERfREFURT0iMTA0 +MzM1NDA3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0iMTA0MzM1NDA3 +NiI+QkxBTUJPVCBDb21pYyBGb250cyAmIExldHRlcmluZzwvQT4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly93d3cuY2hhbmsuY29tL2ZvbnRzLnBocCIgQUREX0RBVEU9IjEwNDI2NDY4NzQi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDIiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkNIQU5L +IEZPTlRTITwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuY2hlYXBza2F0ZWZv +bnRzLmNvbS9mb250cy5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0 +ODE3NDY0MiIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+Q2hlYXBza2F0ZUZvbnRzIC0gRm9u +dHM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LndlYm1hc3RlcmJhc2UuY29t +L2FydGljbGUucGhwLzgxMSIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgx +NzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkRyLiBEZXNpZ24ncyBEZWZpbml0aXZl +IERlc2lnbiBMaW5rcyBMaXN0PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2Rlc2t0 +b3BwdWIuYWJvdXQuY29tL2NzL3RoZW1lZm9udHMvIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+Rm9udCBDb2xs +ZWN0aW9ucyBpbiBTcGVjaWFsdHkgVGhlbWVzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0 +cDovL3d3dy5mcmVzaG1lZGlhLm5sLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9 +IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPmZvbnQtby12aWxsZTwvQT4N +CiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cubW9vcnN0YXRpb24ub3JnL3R5cG9hc2lz +L2Rlc2lnbmVycy9mb250bWFrZXIvZm9udG1ha2VyLmh0bSIgQUREX0RBVEU9IjEwNDI2NDY4NzQi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkZvbnRt +YWtlciBbUEFHRSAxXTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZm9udG9z +YXVydXMuY29tL2ZvbnRzLmFzcD90YXJnZXQ9bnVsbCIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExB +U1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkZvbnRvc2F1 +cnVzIFRleHQ8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmZvbnRzbnRoaW5n +cy5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+Rm9udHMgJiBUaGluZ3MgLSB0aGUgbW9zdCB1bnVzdWFs +IGZvbnRzIG9ubGluZS4uLjwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZnJl +ZS10eXBld3JpdGVyLWZvbnRzLmNvbS9Gb250cy5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NCIg +TEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+RnJlZSBU +eXBld3JpdGVyIEZvbnRzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5sYXJh +YmllZm9udHMuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkxhcmFiaWUgRm9udHM8L0E+DQogICAgICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm9yZ2RvdC5jb20vYWxpYXNmb250cy8iIEFERF9EQVRF +PSIxMDQ2MTA0MDM4IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQ2 +MTA0MDM5Ij5Pcmdkb3Qgb3BlbiBzb3VyY2UgcGl4ZWwgYW5kIGxlZCBmb250cyBmb3IgZmxhc2g8 +L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnBoYW50b21wb3dlci5kZS9waGFu +dG9tcGhvbnRzLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5waGFudG9tcGhvbnRzPC9BPg0KICAgICAg +ICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5pYW1jYWwuY29tL2ZvbnRzLyIgQUREX0RBVEU9IjEw +NDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4 +NzQiPlNtYWxsIEZvbnRzIGJ5IENhbCBIZW5kZXJzb248L0E+DQogICAgICAgIDxEVD48QSBIUkVG +PSJodHRwOi8vd3d3LmRvZ2hhdXNlLmNvbS9mb250cy5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3 +NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+VGhl +IERvZyBIYXVzZSBGb250czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cud3Bk +ZmQuY29tL3dwZHR5cG8zYS5odG0iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIx +MDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5XZWIgUGFnZSBEZXNpZ24gZm9y +IERlc2lnbmVycyAtIFBpeGVsIEZvbnRzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDov +L3d3dy5waXp6YWR1ZGUuZGsvZm9udHMuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1Rf +VklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPnd3dy5waXp6YWR1 +ZGUuZGsgIGZvbnRzLmh0bWw8L0E+DQogICAgPC9ETD48cD4NCiAgICA8RFQ+PEgzIEZPTERFRCBB +RERfREFURT0iMTA0MjY0Njg3NCI+RnVubmllczwvSDM+DQogICAgPERMPjxwPg0KICAgICAgICA8 +RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5zYXRpcmV3aXJlLmNvbS9pbmRleC5zaHRtbCIgQUREX0RB +VEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEw +NDI2NDY4NzQiPlNhdGlyZVdpcmUgIGRvdC5jb20uZWR5PC9BPg0KICAgICAgICA8RFQ+PEEgSFJF +Rj0iaHR0cDovL3NubC5qdC5vcmcvIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+U05MIE1NIChTYXR1cmRheSBO +aWdodCBMaXZlIE11bHRpbWVkaWEgLSBzbmwuanQub3JnKSBZT1VSIFNPVVJDRSBGT1IgU05MIE1V +TFRJTUVESUEsIHNhdHVyZGF5IG48L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vcmlu +a3dvcmtzLmNvbS9kaWFsZWN0LyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEw +NDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPlRoZSBEaWFsZWN0aXplcjwvQT4N +CiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9pbmZvbWVkaWEuanQub3JnL2luZGV4LnBodG1s +IiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJ +RklFRD0iMTA0MjY0Njg3NCI+V2VsY29tZSB0byBTTkwgSW5mb01lZGlhPC9BPg0KICAgIDwvREw+ +PHA+DQogICAgPERUPjxIMyBGT0xERUQgQUREX0RBVEU9IjEwNDI2NDY4NzQiPkdyYXRlZnVsIERl +YWQ8L0gzPg0KICAgIDxETD48cD4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9jZmEtd3d3 +LmhhcnZhcmQuZWR1L2NmYS9wcy9zcGVjaWFsL0dhcmNpYS5odG1sIiBBRERfREFURT0iMTA0MjY0 +Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+ +KDQ0NDIpIEdhcmNpYSAoU3Rhcik8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vY2Zh +LXd3dy5oYXJ2YXJkLmVkdS9jZmEvcHMvc3BlY2lhbC9yb2NrbnJvbGwvMDAwNDQ0Mi5odG1sIiBB +RERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NCI+KDQ0NDIpIEdhcmNpYTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0 +dHA6Ly9zbGF0ZS5tc24uY29tLz9pZD0yMDcwMjUxIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+QSBMb25nLCBT +dGFpZCBUcmlwIC0gSG93IERlYWRoZWFkcyBydWluZWQgdGhlIEdyYXRlZnVsIERlYWQuIEJ5IE1h +cmOgV2VpbmdhcnRlbjwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuYWNjZXNz +cGxhY2UuY29tL2dyYXRlZnVsLmh0bSIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9 +IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkFjY2VzcyBQbGFjZSBHcmF0 +ZWZ1bCBEZWFkIC0gTHlyaWNzLCBQaWN0dXJlcywgTVAzLCBTZXRsaXN0cy4uPC9BPg0KICAgICAg +ICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy50aGViZWFyLm9yZy8iIEFERF9EQVRFPSIxMDQyNjQ2 +ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5C +RUFSJ1MgQVJUIFBBR0VTPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5uaWku +bmV0L35vYmllMS9kZWFkY2QvYmV0dHlfYm9hcmRfaW5mby5odG0iIEFERF9EQVRFPSIxMDQyNjQ2 +ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5C +ZXR0eSBCb2FyZCBpbmZvPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5ibGFp +cmphY2tzb24uY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkJsYWlyIEphY2tzb24gLSBHYXJjaWE8L0E+ +DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXBzP3E9 +YnVmZmFsbytncm91cDpyZWMubXVzaWMuZ2RlYWQmaGw9ZW4mYXNfZHJyYj1iJmFzX21pbmQ9MTIm +YXNfbWlubT01JmFzX21pbnk9MTk4MSZhc19tYXhkPTE3JmFzX21heG09MTImYXNfbWF4eT0xOTkx +JnJudW09OCZzZWxtPTE5OTBKdWwyMC4xNDI2MTYuMTM3OTIlNDB1dmFhcnBhLlZpcmdpbmlhLkVE +VSIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzQiPkJ1ZmZhbG8gTmV3cyBDb25jZXJ0IFJldmlldyA3LTE3LTkwPC9B +Pg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2l2ZXJtY2xlb2QudHJpcG9kLmNvbS9wb3N0 +ZXJmcmFtZXMuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkNvbmNlcnQgUG9zdGVyczwvQT4NCiAgICAg +ICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9kYi5ldHJlZS5vcmcvYnJvd3NlYnlteXNob3dzLnBocD9h +cnRpc3Q9MiIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExB +U1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPmRiLmV0cmVlLm9yZyAtIEdEIGJ5IFllYXI8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vcHViNy5lemJvYXJkLmNvbS9iZGVhZGhvb2siIEFE +RF9EQVRFPSIxMDQ4MDE0NjQ2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVE +PSIxMDQ4MDE0NjQ3Ij5EZWFkaG9vayBAIHd3dy5lemJvYXJkLmNvbTwvQT4NCiAgICAgICAgPERU +PjxBIEhSRUY9Imh0dHA6Ly93d3cuZGVhZGxlZ3MuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPmRlYWRs +ZWdzLmNvbSBtcDMgYW5kIHJlYWwgYXVkaW8gbGlicmFyeSBvZiBncmF0ZWZ1bCBkZWFkIHF1YWxp +dHkgYXVkaW8uIE1wMyBzaG93cyBhbmQgTXAzIGJvb3RsPC9BPg0KICAgICAgICA8RFQ+PEEgSFJF +Rj0iaHR0cDovL3d3dy5kZWFkc2hvdy5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+RGVhZHNob3cuY29t +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5nZW9jaXRpZXMuY29tL1N1bnNl +dFN0cmlwL1BhbG1zLzU1MjAvZGVhZDEuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1Rf +VklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkRpZCBZb3UgS25v +dzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9sYXdyb21haW5lLmNvbS9pZDIwLmh0 +bSIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzQiPkRvdWcgSXJ3aW5zIEZpcnN0IEFtZW5kZWQgUGV0aXRpb24gdW5k +ZXIgUHJvYmF0ZSBDb2RlIHNlY3Rpb24gOTg2MDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0 +dHA6Ly93d3cuZG96aW4uY29tLyMiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIx +MDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5Eb3ppbi5jb208L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmV1cm9kZWFkLm5ldC8iIEFERF9EQVRFPSIxMDQy +NjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0 +Ij5FdXJvZGVhZC5uZXQgLSBmb3IgR3JhdGVmdWwgRGVhZCBmYW5zIGV2ZXJ5d2hlcmU8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vZXVyb2RlYWQubmV0L3BhZ2VzLyIgQUREX0RBVEU9 +IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2 +NDY4NzQiPkV1cm9kZWFkLm5ldCBMaW5rcyBEaXJlY3Rvcnk8L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vd3d3LnBzeWtlZGVsYm9rLnNlL2dhcmNpYXNfZ3VpdGFycy5odG1sIiBBRERf +REFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NCI+R2FyY2lhJ3MgR3VpdGFycyBNYWMgVmlkZW8gR2FtZTwvQT4NCiAgICAgICAg +PERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZ2RjZGNvdmVycy5jb20vIiBBRERfREFURT0iMTA0MjY0 +Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+ +R0QgQ0QtUiBDb3ZlcnM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lmdvb2ds +ZS5jb20vc2VhcmNoP3E9Z3JhdGVmdWwrZGVhZCsxJTJGMjAlMkY3OSIgQUREX0RBVEU9IjEwNDI2 +NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQi +Pkdvb2dsZSBTZWFyY2ggZ3JhdGVmdWwgZGVhZCAxLTIwLTc5PC9BPg0KICAgICAgICA8RFQ+PEEg +SFJFRj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3Vwcz9obD1lbiZscj0mc2FmZT1vZmYm +Z3JvdXA9cmVjLm11c2ljLmdkZWFkIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+R29vZ2xlIFNlYXJjaCByZWMu +bXVzaWMuZ2RlYWQ8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vZGlyZWN0b3J5Lmdv +b2dsZS5jb20vVG9wL0FydHMvTXVzaWMvQmFuZHNfYW5kX0FydGlzdHMvRy9HcmF0ZWZ1bF9EZWFk +LyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzQiPkdvb2dsZSBXZWIgRGlyZWN0b3J5IC0gQXJ0cyAgTXVzaWMgIEJh +bmRzoGFuZKBBcnRpc3RzICBHICBHcmF0ZWZ1bKBEZWFkPC9BPg0KICAgICAgICA8RFQ+PEEgSFJF +Rj0iaHR0cDovL3d3dy5ncmFtbXkuY29tL2ZlYXR1cmVzLzAxMTdfbWNuYWxseS5odG1sIiBBRERf +REFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NCI+R1JBTU1ZLmNvbSAtIEludGVydmlldyB3aXRoIERlbm5pcyBNY05hbGx5PC9B +Pg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5ncmF0ZWZ1bGRheS5jb20vIiBBRERf +REFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NCI+R3JhdGVmdWwgRGF5PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDov +L3d3dy53ZWxsLmNvbS91c2VyL2FsbWFuYWMvIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+R3JhdGVmdWwgRGVh +ZCBBbG1hbmFjPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5iYXJuY2FyZC5j +b20vZ2QuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkdSQVRFRlVMIERFQUQgQVQgV0lOVEVSTEFORCwg +TkVXIFlFQVInUyAxOTcyLTczPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5k +ZWFkZGlzYy5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+R3JhdGVmdWwgRGVhZCBGYW1pbHkgRGlzY29n +cmFwaHk8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmNzLmNtdS5lZHUvfm1s +ZW9uZS9nZGVhZC9mYXEvZmFxLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lU +PSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5HcmF0ZWZ1bCBEZWFkIEZy +ZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDov +L3d3dy5uZXRyZWFjaC5uZXQvfm5ob2plbS9kZWFkbGluay5odG0iIEFERF9EQVRFPSIxMDQyNjQ2 +ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5H +cmF0ZWZ1bCBEZWFkIExpbmtzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5n +ZGxpdmUuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkdSQVRFRlVMIERFQUQgTElWRSAtIHd3dy5nZGxp +dmUuY29tPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dzMuY2xlYXJsaWdodC5j +b20vfmFjc2EvaW50cm8uaHRtIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0 +ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+R3JhdGVmdWwgRGVhZCBMeXJpYyBB +bmQgU29uZyBGaW5kZXI8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lmd1aXRh +ci5jb20vRzJLZmVhdHVyZXMvdmlld2ZlYXR1cmUuYXNwP2ZlYXR1cmVJRD00MiIgQUREX0RBVEU9 +IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2 +NDY4NzQiPkd1aXRhci5jb20gLSBKZXJyeSBHYXJjaWEgVGhlIEFjb3VzdGljIE1hbidzIERlYWQ8 +L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnN0cmF0ZWd5LWJ1c2luZXNzLmNv +bS9zdHJhdGVneS85NzEwNi9wYWdlMS5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+SG93IHRvICdUcnVj +aycgdGhlIEJyYW5kIExlc3NvbnMgZnJvbSB0aGUgR3JhdGVmdWwgRGVhZCAtIFBhZ2UgMTwvQT4N +CiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9sYXdyb21haW5lLmNvbS9pZDQuaHRtIiBBRERf +REFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NCI+SmVycnkgR2FyY2lhcyBHdWl0YXJzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJF +Rj0iaHR0cDovL3d3dy5jb25zZXJ2YXRvcnkuY29tL2VyaWMvIiBBRERfREFURT0iMTA0MjY0Njg3 +NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+TG9u +ZSBTdGFyIERlYWQgd2ViIHNwYWNlPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3 +dy5wc2lsby5jb20vZGVhZC9pbmRleC5waHAiIEFERF9EQVRFPSIxMDQ2NDQzMjk1IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQ2NDQzMjk1Ij5wc2lsby5jb20gLSBE +ZWFkIFRpY2tldHMsIFBhc3NlcywgJiBMYW1pbmF0ZXM8L0E+DQogICAgICAgIDxEVD48QSBIUkVG +PSJodHRwOi8vd3d3LnJvY2toYWxsLmNvbS9ob2YvaW5kdWN0ZWUuYXNwP2lkPTExMyIgQUREX0RB +VEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEw +NDI2NDY4NzQiPlJvY2sgYW5kIFJvbGwgSGFsbCBvZiBGYW1lIGFuZCBNdXNldW0gIEhhbGwgb2Yg +RmFtZSAgSW5kdWN0ZWUgRGV0YWlsPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3 +dy5yb2xsaW5nc3RvbmUuY29tL2FydGlzdHMvZGVmYXVsdC5hc3A/YWZsPXNlcyZvaWQ9MzQzIiBB +RERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NCI+Um9sbGluZ1N0b25lLmNvbSBBcnRpc3RzIFRoZSBHcmF0ZWZ1bCBEZWFk +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2RiLmV0cmVlLm9yZy9zaG5saXN0LnBo +cD9hcnRpc3Q9MiZ5ZWFyPTE5OTUiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIx +MDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5TSE4gTGlzdCBmb3IgR3JhdGVm +dWwgRGVhZDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZWZmLm9yZy9wdWIv +UHVibGljYXRpb25zL0pvaG5fUGVycnlfQmFybG93L0hUTUwvYmFybG93c19seXJpY3MuaHRtbCIg +QUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzQiPlNvbmdzIGZvciB0aGUgRGVhZDwvQT4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly93d3cuc2ZnYXRlLmNvbS9jZ2ktYmluL2FydGljbGUuY2dpP2ZpbGU9L2MvYS8y +MDAxLzExLzA2L0RENjIzNjQuRFRMIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+U3RyaW5ncyBvZiBnb2xkIC0g +VGhlcmUgd2FzIHNvbWV0aGluZyBzcGVjaWFsIGFib3V0IERvdWcgSXJ3aW4ncyBndWl0YXJzLCBh +bmQgSmVycnkgR2FyY2lhIGtuZXc8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3 +Lm1hdGgudWthbnMuZWR1L3RidC92ZW51ZXMvTlkuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzQi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPlRCVCBW +ZW51ZXMgTmV3IFlvcms8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vYXJ0cy51Y3Nj +LmVkdS9nZGVhZC9hZ2RsLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgx +NzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPlRoZSBBbm5vdGF0ZWQgR3JhdGVmdWwg +RGVhZCBMeXJpY3MsIGJ5IERhdmlkIERvZGQ8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vd3d3LmV1cm9kZWFkLm5ldC9jZ2ktYmluL2lrb25ib2FyZC9mb3J1bXMuY2dpP2ZvcnVtPTIi +IEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElG +SUVEPSIxMDQyNjQ2ODc0Ij5UaGUgRGVhZEJvYXJkICBEZWFkIEdlbmVyYWwgIEdvdCBzb21ldGhp +bmcgdG8gdGFsayBhYm91dDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cubWFt +YmEuZGVtb24uY28udWsvaGVhZHMvaW5kZXguaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExB +U1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPlRoZSBEZWFk +aGVhZHMgTmV3c2xldHRlcnMgMTk3MiAtMTk3NDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0 +dHA6Ly93d3cuYXBibmV3cy5jb20vbWVkaWEvZ2ZpbGVzL2RlYWQvZGVhZGZpbGVzLmh0bWwiIEFE +RF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVE +PSIxMDQyNjQ2ODc0Ij5UaGUgR3JhdGVmdWwgRGVhZCAtIEZCSSBGaWxlczwvQT4NCiAgICAgICAg +PERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuc2V0bGlzdHMubmV0LyIgQUREX0RBVEU9IjEwNDI2NDY4 +NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPlRo +ZSBTZXRMaXN0IFByb2dyYW08L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnRo +ZXNtb2tpbmdndW4uY29tL2FyY2hpdmUvZ2FyY2lhMS5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3 +NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+VGhl +IFNtb2tpbmcgR3VuIEFyY2hpdmUtIEdhcmNpYSdzIEFzc2V0czwvQT4NCiAgICAgICAgPERUPjxB +IEhSRUY9Imh0dHA6Ly93d3cudGhlc3RhbmRhcmQuY29tL2FydGljbGUvZGlzcGxheS8wLDExNTEs +MjI4NTAsMDAuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPlRoZVN0YW5kYXJkLmNvbSBJJ20gV2l0aCB0 +aGUgQnJhbmQ8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vaG9tZS5ueWNhcC5yci5j +b20vY29udGVudC91c19kZWFkLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lU +PSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5VbmNsZSBTYW0gYW5kIHRo +ZSBHcmF0ZWZ1bCBEZWFkPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53aXJl +ZC5jb20vbmV3cy9jdWx0dXJlLzAsMTI4NCw0MzE4NCwwMC5odG1sIiBBRERfREFURT0iMTA0MjY0 +Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+ +V2lyZWQuY29tIC0gQXByaWwgMjMsIDIwMDEgLSBEZWFkaGVhZHMgTWF5IE5vdCBCZSBHcmF0ZWZ1 +bDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZ2RsaXZlLmNvbS9zaG4vIiBB +RERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NCI+d3d3LmdkbGl2ZS5jb20gLSAtc2huLTwvQT4NCiAgICA8L0RMPjxwPg0K +ICAgIDxEVD48SDMgRk9MREVEIEFERF9EQVRFPSIxMDQyNjQ2ODc0Ij5JbmRpZSBNdXNpYyBTaXRl +czwvSDM+DQogICAgPERMPjxwPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5pbmRp +ZXRhYnMubmV0LyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPi0taW5kaWV0YWJzLm5ldCAgaSBjYW4ndCBmcmVl +c3R5bGUuIGknbSBhIGxvdyBidWRnZXQgbHVkYWNyaXMuPC9BPg0KICAgICAgICA8RFQ+PEEgSFJF +Rj0iaHR0cDovL3d3dy4zMG11c2ljLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij4tMzAtbXVzaWMgLi4u +IDMwbXVzaWMuY29tPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy4zd2suY29t +LyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzQiPjNXSyBVbmRlcmdyb3VuZCBSYWRpbyAtIEludGVybmV0IE9ubHkg +QWx0ZXJuYXRpdmUgUmFkaW8hPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5h +dmVyc2lvbi5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+QXZlcnNpb24uY29tIC0gUm9jayAgUHVuayAg +SW5kaWUgTXVzaWM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmJhcnN1ay5j +b20vd2ViLmNnaSIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPmJhcnN1ayByZWNvcmRzPC9BPg0KICAgICAgICA8 +RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5jbWouY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzQiIExB +U1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzQiPkNNSiBOZXcg +TXVzaWMgRmlyc3Q8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vY3dhcy5oaW5haC5j +b20vbmV3cy8iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBM +QVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5Db21lcyB3aXRoIGEgU21pbGU8L0E+DQogICAgICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LjItNC03LW11c2ljLmNvbS9mcm9udHBhZ2UuYXNwIiBB +RERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NCI+Q3J1ZCBNYWdhemluZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0 +dHA6Ly93d3cuYWRlcXVhY3kubmV0L2luZGV4LnNodG1sIiBBRERfREFURT0iMTA0MjY0Njg3NCIg +TEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+RGVsdXNp +b25zIG9mIEFkZXF1YWN5PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5kdXN0 +ZWRtYWdhemluZS5jb20vIiBBRERfREFURT0iMTA0NTE2NzU4NSIgTEFTVF9WSVNJVD0iMTA0ODE3 +NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0NTE2NzU4NSI+RHVzdGVkIE1hZ2F6aW5lPC9BPg0KICAg +ICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5lbW1pZW1hZy5jb20vIiBBRERfREFURT0iMTA0 +MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3 +NCI+RW1taWUgTWFnYXppbmU8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmVw +aXRvbmljLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQz +IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5FcGl0b25pYy5jb20gSGkgUXVhbGl0eSBGcmVl +IE1QMyBNdXNpYzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuYmFzZW1lbnQt +bGlmZS5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIg +TEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+aHR0cC0td3d3LmJhc2VtZW50LWxpZmUuY29tLTwv +QT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuaHlicmlkbWFnYXppbmUuY29tL2lu +ZGV4Lmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBM +QVNUX01PRElGSUVEPSIxMDQyNjQ2ODc0Ij5oeWJyaWRtYWdhemluZS5jb208L0E+DQogICAgICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmlubXVzaWN3ZXRydXN0LmNvbS8iIEFERF9EQVRFPSIx +MDQyNjQ2ODc0IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2 +ODc0Ij5JbiBNdXNpYyBXZSBUcnVzdDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93 +d3cuaW5kaWV3b3Jrc2hvcC5jb20vbmV3cy8iIEFERF9EQVRFPSIxMDQ1MTcwNTM3IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQ1MTcwNTM4Ij5pbmRpZXdvcmtzaG9w +LmNvbTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuaW5zb3VuZC5jb20vIiBB +RERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NCI+aW5zb3VuZDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93 +d3cuanVua21lZGlhLm9yZy9pbmRleC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NCIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NCI+aiB1IG4gayBtIGUg +ZCBpIGEgIG11c2ljIG5ld3MsIHJldmlld3MgJiBpbnRlcnZpZXdzPC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL2xvc3RhdHNlYS5uZXQvTEFTLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkwgbyBz +IHQgQSB0IFMgZSBhIC4gbyBuIGwgaSBuIGU8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vd3d3LmtuZXJkLmNvbS9+aW5kaWVwb3BsaXZlLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExB +U1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkxpdmUgSW5k +aWUgUm9jayBNdXNpYzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9tcDMucGFsdWth +dmlsbGUubmV0L2RlZmF1bHQuYXNwP2JhbmQ9MyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1Rf +VklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPm1wMy5wYWx1a2F2 +aWxsZS5uZXQ8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnByb2plY3RhdGxh +bnRpc3ppbmUuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlAgUiBPIEogRSBDIFQgIEEgVCBMIEEgTiBU +IEkgUyBaIEkgTiBFPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5waXRjaGZv +cmttZWRpYS5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+UGl0Y2hmb3JrbWVkaWEuY29tPC9BPg0KICAg +ICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5wb3BtYXR0ZXJzLmNvbS8iIEFERF9EQVRFPSIx +MDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2 +ODc1Ij5Qb3BNYXR0ZXJzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5yb2Nr +ZXQtZnVlbC5jb20vIiBBRERfREFURT0iMTA0NTE3MDA2NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +MyIgTEFTVF9NT0RJRklFRD0iMTA0NTE3MDA2NSI+Um9ja2V0IEZ1ZWwgT25saW5lIE1hZ2F6aW5l +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5zb3VuZHRoZXNpcmVucy5jb20v +IiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJ +RklFRD0iMTA0MjY0Njg3NSI+U09VTkRUSEVTSVJFTlMuQ09NIC0gSW5kZXBlbmRlbnQgT25saW5l +IE1hZ2F6aW5lPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5zcGxlbmRpZGV6 +aW5lLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBM +QVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5TcGxlbmRpZDwvQT4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly90b25ldmVuZG9yLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij50b25ldmVuZG9yLmNv +bSAuIHdlbGNvbWU8L0E+DQogICAgPC9ETD48cD4NCiAgICA8RFQ+PEgzIEZPTERFRCBBRERfREFU +RT0iMTA0MjY0Njg3NSI+SW5mb3JtYXRpb24gQXJjaGl0ZWN0dXJlPC9IMz4NCiAgICA8REw+PHA+ +DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vYXJndXMtYWNpYS5jb20vaW5kZXguaHRtbCIg +QUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzUiPkFyZ3VzIENlbnRlciBmb3IgSW5mb3JtYXRpb24gQXJjaGl0ZWN0dXJl +PC9BPg0KICAgIDwvREw+PHA+DQogICAgPERUPjxIMyBGT0xERUQgQUREX0RBVEU9IjEwNDI2NDY4 +NzUiPkpvYnM8L0gzPg0KICAgIDxETD48cD4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93 +d3cuYnVmZmFsb2pvYmZpbmRlci5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJ +VD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+QnVmZmFsb0pvYkZpbmRl +ci5jb208L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmdyZWF0am9ibmV0d29y +ay5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+R3JlYXRKb2JOZXR3b3JrLmNvbSAgSm9icyBpbiBCdWZm +YWxvLCBOZXcgWW9yazwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuaG90am9i +cy5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+SG90Sm9icy5jb208L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vd3d3LmlhbWJ1ZmZhbG9uaWFnYXJham9icy5jb20vIiBBRERfREFURT0iMTA0 +MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3 +NSI+aWFtYnVmZmFsb25pYWdhcmFqb2JzLmNvbTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0 +dHA6Ly93d3cud255am9icy5jb20vZGVmYXVsdC5hc3AiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBM +QVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5XZXN0ZXJu +IE5ldyBZb3JrIEpvYnMgPC9BPg0KICAgIDwvREw+PHA+DQogICAgPERUPjxIMyBGT0xERUQgQURE +X0RBVEU9IjEwNDI2NDY4NzUiPkxhYjwvSDM+DQogICAgPERMPjxwPg0KICAgICAgICA8RFQ+PEEg +SFJFRj0iaHR0cDovL3d3dy5ibGFja2xhYnN0dWRpb3MuY29tL0dhbGxlcnlfZmlsZXMvZ2FsbGVy +eS1hdXR1bW4uaHRtIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+QmxhY2sgTGFiIFN0dWRpb3MgLSBHYWxsZXJ5 +IEF1dHVtbjwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cucHVwc29uY3Vwcy5j +b20vbGlua3MvIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIg +TEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+RG9nIExpbmtzIC0gRS1jb21tZXJjZTwvQT4NCiAg +ICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cubHVja3lsYWIuY29tLyIgQUREX0RBVEU9IjEw +NDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4 +NzUiPkxVQ0tZIExBQlJBRE9SIEJSRVdJTkcgQ09NUEFOWTwvQT4NCiAgICA8L0RMPjxwPg0KICAg +IDxEVD48SDMgRk9MREVEIEFERF9EQVRFPSIxMDQxMjY1NzgzIj5MaW5rczwvSDM+DQogICAgPERM +PjxwPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy4zd2suY29tL2NoYXJ0Lmh0bSIg +QUREX0RBVEU9IjEwNDQyODg4NTMiIExBU1RfVklTSVQ9IjEwNDgxNzIzNDMiIExBU1RfTU9ESUZJ +RUQ9IjEwNDQyODg4NTMiPjNXSzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9hZG1p +bi5zeW5hY29yLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTcy +MjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5BZG1pbjwvQT4NCiAgICAgICAgPERUPjxB +IEhSRUY9Imh0dHA6Ly93d3cuYnVmZmFsb25ld3MuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUi +IExBU1RfVklTSVQ9IjEwNDgxNzIyNDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkJOZXdz +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53bnltdXNpYy5jb20vYm9hcmQi +IEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTcyOTUyIiBMQVNUX01PRElG +SUVEPSIxMDQyNjQ2ODc1Ij5Cb2FyZDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9k +Yi5ldHJlZS5vcmcvYnJvamF5IiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0 +ODE3MjM0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+Q0RSPC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL3d3dy5kZW1vbi5uZXQvZXh0ZXJuYWwvIiBBRERfREFURT0iMTA0MjY0 +Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3MjM0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+ +RGVtb248L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vY2dpMS5lYmF5LmNvbS9hdy1j +Z2kvZWJheUlTQVBJLmRsbD9NeUViYXlJdGVtc0JpZGRpbmdPbiZ1c2VyaWQ9amF5dHJhZGVyNzEm +cGFzcz1oVlRVYkU4UHMxNnJkcXQ1SC5jNDMwMiZmaXJzdD1OJnNlbGxlclNvcnQ9MyZiaWRkZXJT +b3J0PTMmd2F0Y2hTb3J0PTMmZGF5c3NpbmNlPTImcDE9MCZwMj0wJnAzPTAmcDQ9MCZwNT0wIiBB +RERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3MjI0NCIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NSI+ZUJheTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cu +ZmFyay5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3MjI0NCIg +TEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+RmFyazwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9 +Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lU +PSIxMDQ4MTcyMzQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5Hb29nbGU8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vcWEuY2hlay5jb20vfmpnZXJsYW5kL3Bob2VuaXgvamF5 +LnBocD9wcm9kX2NvZGU9NDMiIEFERF9EQVRFPSIxMDQ0NjM5ODQ4IiBMQVNUX1ZJU0lUPSIxMDQ4 +MTcyMjQ0IiBMQVNUX01PRElGSUVEPSIxMDQ4MDgzNTU1Ij5qYXk8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vd3d3Lmxpc2hvc3QuY29tL35qYXkvd255bXVzaWMvYm9hcmQvIiBBRERf +REFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3MjM0MyIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NSI+TGlzaG9zdCAtIEJvYXJkPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0 +cHM6Ly9vbmxpbmViYW5raW5nLm1hbmR0YmFuay5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIg +TEFTVF9WSVNJVD0iMTA0ODE3MjM0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+TSZUPC9B +Pg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5taW5kbGVhZGVycy5jb20vIiBBRERf +REFURT0iMTA0NTA2MzkzOSIgTEFTVF9WSVNJVD0iMTA0ODE3MjI0NCIgTEFTVF9NT0RJRklFRD0i +MTA0NTA2MzkzOSI+TWluZExlYWRlcnM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8v +d3d3Lm1zbmJjLmNvbS9uZXdzL2RlZmF1bHQuYXNwIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFT +VF9WSVNJVD0iMTA0ODE3MjI0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+TVNOPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL215LmZvb2wuY29tLyIgQUREX0RBVEU9IjEwNDI2 +NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzIzNDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUi +Pk15Rm9vbDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9teXViLmJ1ZmZhbG8uZWR1 +LyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzIzNDMiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzUiPk15VUI8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8v +d3d3Lm55dGltZXMuY29tL3lyL21vL2RheS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTcyMjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5OWVQ8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJqYXZhc2NyaXB0OnBocGZ1bmM9d2luZG93LnByb21wdCgnUEhQIEZ1 +bmN0aW9uIExvb2t1cDonLCcnKSA7IGlmKHBocGZ1bmMgJiYgcGhwZnVuYyAhPSAnJykgeyB3aW5k +b3cubG9jYXRpb24gPSAnaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC1sb29rdXAucGhwP2Z1bmN0 +aW9uPScgK3BocGZ1bmM7IH0gZWxzZSB7IGhpc3RvcnkuZ28oLTEpOyB9IiBBRERfREFURT0iMTA0 +MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3MjI0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3 +NSI+UEhQPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3FhLmNoZWsuY29tL2NoZWtp +bi5waHA/dV9kPWpheXRlc3RAcWEuY2hlay5jb20mcGFzc3dvcmQ9dGVzdGpheSZib3VuY2V0bz10 +ZW1wbGF0ZTEzLmNoZWsuY29tIiBBRERfREFURT0iMTA0MzMzOTg5OSIgTEFTVF9WSVNJVD0iMTA0 +ODE3MjI0NCIgTEFTVF9NT0RJRklFRD0iMTA0NjQ0ODY4NCI+UG9ydGFsUUE8L0E+DQogICAgICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vcWEuY2hlay5jb20vfmpnZXJsYW5kL3Byb3BsYXQzLyIgQURE +X0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzIyNDMiIExBU1RfTU9ESUZJRUQ9 +IjEwNDI2NDY4NzUiPlBQMzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9xYS5jaGVr +LmNvbS9+amdlcmxhbmQvcHJvcGxhdDQvIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJ +VD0iMTA0ODE3MjI0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+UFA0PC9BPg0KICAgICAg +ICA8RFQ+PEEgSFJFRj0iaHR0cDovL2RiLmV0cmVlLm9yZy9zaG93bWFpbnQvY29ycmVjdGlvbnMv +IiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3MjM0MyIgTEFTVF9NT0RJ +RklFRD0iMTA0MjY0Njg3NSI+U2V0bGlzdCBDb3JyZWN0aW9uczwvQT4NCiAgICAgICAgPERUPjxB +IEhSRUY9Imh0dHA6Ly9zbGFzaGRvdC5vcmcvIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9W +SVNJVD0iMTA0ODE3MjI0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+U2xhc2g8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnRoZWJsYWNrZG9nLm9yZy8iIEFERF9EQVRF +PSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTcyMzQzIiBMQVNUX01PRElGSUVEPSIxMDQy +NjQ2ODc1Ij5UTUQ8L0E+DQogICAgPC9ETD48cD4NCiAgICA8RFQ+PEgzIEZPTERFRCBBRERfREFU +RT0iMTA0MjY0Njg3NSI+TWVkaWE8L0gzPg0KICAgIDxETD48cD4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9pc2FwaS9yZWRpci5kbGw/cHJkPVdpbmRvd3Mm +c2JwPU1lZGlhUGxheWVyJmFyPUZhdm9yaXRlJnNiYT1CbG9vbWJlcmcmcHZlcj02LjIiIEFERF9E +QVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIx +MDQyNjQ2ODc1Ij5CbG9vbWJlcmc8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3 +Lm1pY3Jvc29mdC5jb20vaXNhcGkvcmVkaXIuZGxsP3ByZD1XaW5kb3dzJnNicD1NZWRpYVBsYXll +ciZhcj1GYXZvcml0ZSZzYmE9Q2FwaXRvbCZwdmVyPTYuMiIgQUREX0RBVEU9IjEwNDI2NDY4NzUi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkNhcGl0 +b2wgUmVjb3JkczwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cubWljcm9zb2Z0 +LmNvbS9pc2FwaS9yZWRpci5kbGw/cHJkPVdpbmRvd3Mmc2JwPU1lZGlhUGxheWVyJmFyPUZhdm9y +aXRlJnNiYT1DQlMmcHZlcj02LjIiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIx +MDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5DQlM8L0E+DQogICAgICAgIDxE +VD48QSBIUkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaXNhcGkvcmVkaXIuZGxsP3ByZD1X +aW5kb3dzJnNicD1NZWRpYVBsYXllciZhcj1GYXZvcml0ZSZzYmE9Q05CQyZwdmVyPTYuMiIgQURE +X0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9 +IjEwNDI2NDY4NzUiPkNOQkMgRG93IEpvbmVzIEJ1c2luZXNzIFZpZGVvPC9BPg0KICAgICAgICA8 +RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2lzYXBpL3JlZGlyLmRsbD9wcmQ9 +V2luZG93cyZzYnA9TWVkaWFQbGF5ZXImYXI9RmF2b3JpdGUmc2JhPUNORVQmcHZlcj02LjIiIEFE +RF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVE +PSIxMDQyNjQ2ODc1Ij5DTkVUIFRvZGF5IC0gVGVjaG5vbG9neSBOZXdzPC9BPg0KICAgICAgICA8 +RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2lzYXBpL3JlZGlyLmRsbD9wcmQ9 +V2luZG93cyZzYnA9TWVkaWFQbGF5ZXImYXI9RmF2b3JpdGUmc2JhPUNOTiZwdmVyPTYuMiIgQURE +X0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9 +IjEwNDI2NDY4NzUiPkNOTiBWaWRlb3NlbGVjdDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0 +dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9pc2FwaS9yZWRpci5kbGw/cHJkPVdpbmRvd3Mmc2JwPU1l +ZGlhUGxheWVyJmFyPUZhdm9yaXRlJnNiYT1EaXNuZXkmcHZlcj02LjIiIEFERF9EQVRFPSIxMDQy +NjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1 +Ij5EaXNuZXk8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5j +b20vaXNhcGkvcmVkaXIuZGxsP3ByZD1XaW5kb3dzJnNicD1NZWRpYVBsYXllciZhcj1GYXZvcml0 +ZSZzYmE9RVNQTiZwdmVyPTYuMiIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEw +NDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkVTUE4gU3BvcnRzPC9BPg0KICAg +ICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2lzYXBpL3JlZGlyLmRs +bD9wcmQ9V2luZG93cyZzYnA9TWVkaWFQbGF5ZXImYXI9RmF2b3JpdGUmc2JhPUZveE5ld3MmcHZl +cj02LjIiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNU +X01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5Gb3ggTmV3czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9 +Imh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9pc2FwaS9yZWRpci5kbGw/cHJkPVdpbmRvd3Mmc2Jw +PU1lZGlhUGxheWVyJmFyPUZhdm9yaXRlJnNiYT1Gb3hTcG9ydHMmcHZlcj02LjIiIEFERF9EQVRF +PSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQy +NjQ2ODc1Ij5Gb3ggU3BvcnRzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5t +aWNyb3NvZnQuY29tL2lzYXBpL3JlZGlyLmRsbD9wcmQ9V2luZG93cyZzYnA9TWVkaWFQbGF5ZXIm +YXI9RmF2b3JpdGUmc2JhPUhvbGx5d29vZCZwdmVyPTYuMiIgQUREX0RBVEU9IjEwNDI2NDY4NzUi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkhvbGx5 +d29vZCBPbmxpbmU8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29m +dC5jb20vaXNhcGkvcmVkaXIuZGxsP3ByZD13aW5kb3dzJnNicD1tZWRpYXBsYXllciZhcj1NZWRp +YSZzYmE9UmFkaW9HdWlkZSZwdmVyPTYuMiIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklT +SVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkludGVybmV0IFJhZGlv +IEd1aWRlPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5taWNyb3NvZnQuY29t +L2lzYXBpL3JlZGlyLmRsbD9wcmQ9V2luZG93cyZzYnA9TWVkaWFQbGF5ZXImYXI9RmF2b3JpdGUm +c2JhPU1TTkJDJnB2ZXI9Ni4yIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0 +ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+TVNOQkM8L0E+DQogICAgICAgIDxE +VD48QSBIUkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaXNhcGkvcmVkaXIuZGxsP3ByZD1X +aW5kb3dzJnNicD1NZWRpYVBsYXllciZhcj1GYXZvcml0ZSZzYmE9TXVzaWNWaWRlb3MmcHZlcj02 +LjIiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01P +RElGSUVEPSIxMDQyNjQ2ODc1Ij5NVVNJQ1ZJREVPUy5DT008L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaXNhcGkvcmVkaXIuZGxsP3ByZD1XaW5kb3dz +JnNicD1NZWRpYVBsYXllciZhcj1GYXZvcml0ZSZzYmE9TkJDJnB2ZXI9Ni4yIiBBRERfREFURT0i +MTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0 +Njg3NSI+TkJDIFZpZGVvU2Vla2VyPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iY2FzdDM6Ly8y +NC40Ni42My4xNjA6NDIwMC9qZXJyeSIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9 +IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlN1Z2FybWVncyBMaXZlIFN0 +cmVhbTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9p +c2FwaS9yZWRpci5kbGw/cHJkPVdpbmRvd3Mmc2JwPU1lZGlhUGxheWVyJmFyPUZhdm9yaXRlJnNi +YT1UVkd1aWRlJnB2ZXI9Ni4yIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0 +ODE3NDY0MyIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+VFYgR3VpZGUgRW50ZXJ0YWlubWVu +dCBOZXR3b3JrPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5taWNyb3NvZnQu +Y29tL2lzYXBpL3JlZGlyLmRsbD9wcmQ9V2luZG93cyZzYnA9TWVkaWFQbGF5ZXImYXI9RmF2b3Jp +dGUmc2JhPVVuaXZlcnNhbFN0dWRpb3MmcHZlcj02LjIiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBM +QVNUX1ZJU0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5Vbml2ZXJz +YWwgU3R1ZGlvcyBPbmxpbmU8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm1p +Y3Jvc29mdC5jb20vaXNhcGkvcmVkaXIuZGxsP3ByZD1XaW5kb3dzJnNicD1NZWRpYVBsYXllciZh +cj1GYXZvcml0ZSZzYmE9V2FybmVyQnJvcyZwdmVyPTYuMiIgQUREX0RBVEU9IjEwNDI2NDY4NzUi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDMiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPldhcm5l +ciBCcm9zLiBIaXAgQ2xpcHM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm1p +Y3Jvc29mdC5jb20vaXNhcGkvcmVkaXIuZGxsP3ByZD1udHNlcnZlciZzYnA9bmV0c2hvdyZhcj1O +ZXRTaG93JnNiYT1FdmVudHMmcHZlcj0zLjAiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQzIiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5XaGF0J3MgT24gTm93 +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2lzYXBp +L3JlZGlyLmRsbD9wcmQ9d2luZG93cyZzYnA9bWVkaWFwbGF5ZXImYXI9TWVkaWEmc2JhPUd1aWRl +JnB2ZXI9Ni4yIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIg +TEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+V2luZG93cyBNZWRpYSBTaG93Y2FzZTwvQT4NCiAg +ICA8L0RMPjxwPg0KICAgIDxEVD48SDMgRk9MREVEIEFERF9EQVRFPSIxMDQyNjQ2ODc1Ij5NdXNp +YzwvSDM+DQogICAgPERMPjxwPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5kY24u +Y29tL2luZGV4LnNodG1sIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3 +NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+RGlnaXRhbCBDbHViIE5ldHdvcmsgKERD +TikgLSBUaGUgTGl2ZSBNdXNpYyBTb3VyY2U8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vd3d3LmVwaXRvbmljLmNvbS9pbmRleC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+RXBpdG9uaWMu +Y29tIEhpIFF1YWxpdHkgRnJlZSBNUDMgTXVzaWM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJo +dHRwOi8vbXAzLnBhbHVrYXZpbGxlLm5ldC9kZWZhdWx0LmFzcD9iYW5kPTMiIEFERF9EQVRFPSIx +MDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2 +ODc1Ij5JbmRpZSBMaXZlIE1QM3MgLSBtcDMucGFsdWthdmlsbGUubmV0PC9BPg0KICAgICAgICA8 +RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5rbmVyZC5jb20vfmluZGllcG9wbGl2ZS8iIEFERF9EQVRF +PSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQy +NjQ2ODc1Ij5MaXZlIEluZGllIFJvY2sgTXVzaWM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJo +dHRwOi8vZWFzeWNhc3Qtc2YubGl2ZTM2NS5jb20vbWVtYmVycy9jb250cm9scGFuZWwubGl2ZSIg +QUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzUiPkxpdmUzNjUuY29tIC0gQnJvYWRjYXN0PC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL2dpci5tcDMuY29tL2dpcj9nZW5yZV9pZD0wJmdlb19pZD0wMDAwMzA0 +OCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzUiPk1QMy5jb20gQnVmZmFsbzwvQT4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly93d3cubXVzaWN0b2RheS5jb20vZGVmYXVsdC5hc3AiIEFERF9EQVRFPSIxMDQy +NjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1 +Ij5NdXNpY1RvZGF5PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5jaG9pY2Vv +bmVvbmxpbmUuY29tL350aW0vbXAzL2pheS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5UaW0ncyBTZWNyZXQg +TVAzIFN0YXNoPC9BPg0KICAgIDwvREw+PHA+DQogICAgPERUPjxIMyBGT0xERUQgQUREX0RBVEU9 +IjEwNDI2NDY4NzUiPk5pY2UgU2l0ZXM8L0gzPg0KICAgIDxETD48cD4NCiAgICAgICAgPERUPjxB +IEhSRUY9Imh0dHA6Ly93d3cuYXRnLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5BcnQgVGVjaG5vbG9n +eSBHcm91cDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuYmxhY2tkb2dpbnRl +cmFjdGl2ZS5jb20vaW5kZXguYXNwIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+QmxhY2sgRG9nIEludGVyYWN0 +aXZlICBBIE5ldyBCcmVlZDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuYm9y +bm1hZy5jb20vbW90aGVyLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIx +MDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5Cb3JuIE1hZ2F6aW5lIERlc2ln +biBhbmQgTGl0ZXJhdHVyZSBDb2xsYWJvcmF0aW9uPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0i +aHR0cDovL3d3dy5icmllbmNlLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lU +PSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5CcmllbmNlLmNvbTwvQT4N +CiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZmFjdGl2YS5jb20vIiBBRERfREFURT0i +MTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0 +Njg3NSI+RmFjdGl2YSwgYSBEb3cgSm9uZXMgUmV1dGVycyBDb21wYW55PC9BPg0KICAgICAgICA8 +RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5mYWN0b3JkZXNpZ24uY29tLyIgQUREX0RBVEU9IjEwNDI2 +NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUi +PkZBQ1RPUiBERVNJR048L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmVzY2Fw +ZWhldi5jb20vaW5kZXguYXNwIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0 +ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+Rm9yZCBIRVY8L0E+DQogICAgICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmZ1c2lvbm9uZS5jb20vIiBBRERfREFURT0iMTA0MjY0 +Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+ +ZnVzaW9uT25lPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5paHQuY29tL2Zy +b250cGFnZS5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+SW50ZXJuYXRpb25hbCBIZXJhbGQgVHJpYnVu +ZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuaXN5bmRpY2F0ZS5jb20vIiBB +RERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NSI+aVN5bmRpY2F0ZSBTeW5kaWNhdGlvbiBzb2x1dGlvbnMgYnVpbHQgb24g +b3VyIEludGVsbGlnZW50IFN5bmRpY2F0aW9uIE5ldHdvcms8L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vd3d3Lm9kZGNhc3QuY29tL25ld3NpdGUyL3NpdGUvaW5kZXguaHRtbCIgQURE +X0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9 +IjEwNDI2NDY4NzUiPm9kZGNhc3Q8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3 +LnNpZWdlbGdhbGUuY29tL2luZGV4X2ZsYXNoLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBM +QVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5zaWVnZWxn +YWxlICBMYXVuY2g8L0E+DQogICAgPC9ETD48cD4NCiAgICA8RFQ+PEgzIEZPTERFRCBBRERfREFU +RT0iMTA0MjY0Njg3NSI+UEhQPC9IMz4NCiAgICA8REw+PHA+DQogICAgICAgIDxEVD48QSBIUkVG +PSJodHRwOi8vY29kZXdhbGtlcnMuY29tLyIgQUREX0RBVEU9IjEwNDc1NzAzOTQiIExBU1RfVklT +SVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDc1NzAzOTUiPmNvZGV3YWxrZXJzLmNv +bSAtIG1haW4gcGFnZSAtIFBIUCBIZWxwPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDov +L3d3dy5lendlYmRlc2lnbi5jb20vcGhwLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNU +X1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5FWndlYmRlc2ln +bi5jb20gLSBQSFAgUmVzb3VyY2VzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3 +dy5ob3RzY3JpcHRzLmNvbS9QSFAvIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+SG90U2NyaXB0cy5jb20gUEhQ +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5waHBpbnNpZGVyLmNvbS8iIEFE +RF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVE +PSIxMDQyNjQ2ODc1Ij5odHRwLS13d3cucGhwaW5zaWRlci5jb20tPC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL3d3dy5tYWNyb21lZGlhLmNvbS9zb2Z0d2FyZS9kcmVhbXdlYXZlci9z +cGVjaWFsL2V4dGVuZC9waHAvaW5kZXguaHRtbD9wcm9tb2lkPWZtYTVhIiBBRERfREFURT0iMTA0 +NzU3MzE5NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0NzU3MzE5 +NyI+TWFjcm9tZWRpYSAtIFBIUCBhbmQgRHJlYW13ZWF2ZXIgTVg8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vd3d3Lm15c3FsLmNvbS9kb2N1bWVudGF0aW9uL215c3FsL2NvbW1lbnRl +ZC8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01P +RElGSUVEPSIxMDQyNjQ2ODc1Ij5NeVNRTCAgRG9jdW1lbnRhdGlvbiAgTXlTUUwgIENvbW1lbnRl +ZCBNeVNRTCBNYW51YWw8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vbnlwaHAub3Jn +LyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzUiPk5ldyBZb3JrIFBIUCAtIExpbnV4IEFwYWNoZSBNeVNRTCBQSFA8 +L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnBocGhpZGVvdXQuY29tL2FydGlj +bGVzLnBocCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExB +U1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlBIUCBIaWRlb3V0PC9BPg0KICAgICAgICA8RFQ+PEEg +SFJFRj0iaHR0cDovL3d3dy5waHAubmV0L2luZGV4LnBocCIgQUREX0RBVEU9IjEwNDI2NDY4NzUi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlBIUCBI +eXBlcnRleHQgUHJlcHJvY2Vzc29yPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3 +dy5waHAtbWFnLmRlLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlBIUCBNYWdhemluIC0gR2VybWFuPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlv +bi5kYXRlLnBocCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlBIUCBNYW51YWwgZGF0ZTwvQT4NCiAgICAgICAg +PERUPjxBIEhSRUY9Imh0dHA6Ly93d3cucGhwd29ybGQuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4 +NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlBI +UCBXT1JMRCAtIEZyZWUgUEhQIEhlbHAgLCBSZXNvdXJjZXMgYW5kIFNjcmlwdHMgQ29uc3VsdGlu +ZyAtIE1ZU1FMLCBPcmFjbGUgZGF0YWJhc2UgUEhQIFN1cHBvPC9BPg0KICAgICAgICA8RFQ+PEEg +SFJFRj0iaHR0cDovL3d3dy5waHBudWtlLm9yZy8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNU +X1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5QSFAtTnVrZTwv +QT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cucGhwYnVpbGRlci5jb20vIiBBRERf +REFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NSI+UEhQQnVpbGRlci5jb20gLSBUaGUgUmVzb3VyY2UgRm9yIFBIUCBEZXZlbG9w +ZXJzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3BocC1jb24uY29tLyIgQUREX0RB +VEU9IjEwNDc1NjU4NTIiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEw +NDc1NjU4NTIiPlBIUENvbiBFYXN0IDIwMDMgIFVTIENvbmZlcmVuY2UgZm9yIFBIUCBEZXZlbG9w +ZXJzLjwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9waHBkZXZlbG9wZXIub3JnLyIg +QUREX0RBVEU9IjEwNDc1NzA0MzgiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJ +RUQ9IjEwNDc1NzA0MzkiPlBIUERldmVsb3Blci5vcmc8L0E+DQogICAgICAgIDxEVD48QSBIUkVG +PSJodHRwOi8vd3d3LnBocGtpdGNoZW4uY29tLyIgQUREX0RBVEU9IjEwNDc1NjU4MTEiIExBU1Rf +VklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDc1NjU4MTIiPlBIUGtpdGNoZW4g +LSBDb21lIFNlZSBXaGF0J3MgQ29va2luJzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6 +Ly9waHB3aXphcmQubmV0LyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgx +NzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPnBocFdpemFyZCAtIEJ1aWxkaW5nIER5 +bmFtaWMgV2Vic2l0ZXMgd2l0aCBQSFA8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8v +cHguc2tsYXIuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlBYIFBIUCBDb2RlIEV4Y2hhbmdlPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5vbW5pZ3JvdXAuY29tL21haWxtYW4vYXJj +aGl2ZS93ZWJvYmplY3RzLWRldi8yMDAxLUZlYnJ1YXJ5LzAwNjgxOC5odG1sIiBBRERfREFURT0i +MTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0 +Njg3NSI+UmFuZG9tIENWUyBub3RlczwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9w +aHAucmVzb3VyY2VpbmRleC5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+VGhlIFBIUCBSZXNvdXJjZSBJ +bmRleDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuc3RhcnMuY29tL0F1dGhv +cmluZy9MYW5ndWFnZXMvUEhQLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEw +NDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPldEVkwgUEhQPC9BPg0KICAgICAg +ICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5kLnVtbi5lZHUvaXRzcy9zdXBwb3J0L1RyYWluaW5n +L09ubGluZS93ZWJkZXNpZ24vcGhwLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5XZWIgRGVzaWduIFJl +ZmVyZW5jZXMgUEhQPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53ZWJtYXN0 +ZXJiYXNlLmNvbS9zdWJjYXRzLzUzIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+V2VibWFzdGVyQmFzZSAtIFBI +UCBhbmQgTXlTUUw8L0E+DQogICAgPC9ETD48cD4NCiAgICA8RFQ+PEgzIEZPTERFRCBBRERfREFU +RT0iMTA0MjY0Njg3NSI+cGhwQkI8L0gzPg0KICAgIDxETD48cD4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly9oYWNrcy5waHBiYi5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+SGFja3MucGhwQkIu +Q29tPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3BocGJiLnNvdXJjZWZvcmdlLm5l +dC9waHBCQjIvaW5kZXgucGhwIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0 +ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+cGhwQkIgMiAgSW5kZXg8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vcGVyc29uYWwuYmVsbHNvdXRoLm5ldC9hdGwvYS9s +L2FsaWV4YWkvcGhwYmIvIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3 +NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+cGhwQkIyIENWUyBzbmFwc2hvdHM8L0E+ +DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnBocGJiMi11c2Vycy5kZS8iIEFERF9E +QVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIx +MDQyNjQ2ODc1Ij5waHBCQjIuZGU8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vc291 +cmNlZm9yZ2UubmV0L3Byb2plY3RzL3BocGJiLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1Rf +VklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlNvdXJjZUZvcmdl +IFByb2plY3QgSW5mbyAtIHBocEJCPC9BPg0KICAgIDwvREw+PHA+DQogICAgPERUPjxIMyBGT0xE +RUQgQUREX0RBVEU9IjEwNDI2NDY4NzUiPlBocE51a2U8L0gzPg0KICAgIDxETD48cD4NCiAgICAg +ICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9waHBudWtlLm9yZy8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1 +IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5QSFAt +TnVrZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cucWNoYy5jb20vIiBBRERf +REFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NSI+UXVlYmVjIEhhcmRjb3JlIE5ld3M8L0E+DQogICAgICAgIDxEVD48QSBIUkVG +PSJodHRwOi8vZ3JvdXBzLnlhaG9vLmNvbS9ncm91cC9waHBudWtlL2ZpbGVzLyIgQUREX0RBVEU9 +IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2 +NDY4NzUiPllhaG9vISBHcm91cHMgIHBocG51a2UgRmlsZXM8L0E+DQogICAgPC9ETD48cD4NCiAg +ICA8RFQ+PEgzIEZPTERFRCBBRERfREFURT0iMTA0MjY0Njg3NSI+UmVmZXJlbmNlczwvSDM+DQog +ICAgPERMPjxwPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2FsbG11c2ljLmNvbS8iIEFE +RF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVE +PSIxMDQyNjQ2ODc1Ij5BTUcgQWxsIE11c2ljIEd1aWRlPC9BPg0KICAgICAgICA8RFQ+PEEgSFJF +Rj0iaHR0cDovL3d3dy5iYXJ0bGVieS5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+QmFydGxlYnkuY29t +IEdyZWF0IEJvb2tzIE9ubGluZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9meWku +Y25uLmNvbS9meWkvIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+Q05OZnlpLmNvbSAtIFN0dWRlbnQgTWFpbnBh +Z2U8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vZ3d1LmVkdS9+Z3ByaWNlL2hhbmRi +b29rLmh0bSIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExB +U1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkZhc3QgRmFjdHMgSGFuZGJvb2s8L0E+DQogICAgICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmhhcmNvdXJ0LmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2 +ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5o +b21ld29yayBoZWxwIGFuZCBlZHVjYXRpb25hbCByZXNvdXJjZXMgYXQgaGFyY291cnQuY29tPC9B +Pg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3doYXRpcy50ZWNodGFyZ2V0LmNvbS8iIEFE +RF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVE +PSIxMDQyNjQ2ODc1Ij53aGF0aXMuY29tPC9BPg0KICAgIDwvREw+PHA+DQogICAgPERUPjxIMyBG +T0xERUQgQUREX0RBVEU9IjEwNDI2NDY4NzUiPlNldGxpc3RzPC9IMz4NCiAgICA8REw+PHA+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmFsbG1hbmJyb3RoZXJzYmFuZC5jb20vbXVz +aWMvYWJiYXNlLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5BbGxtYW4gQnJvdGhlcnMgQmFuZCBTZXRs +aXN0czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9iZW5oYXJwZXIubmV0L3NldGxp +c3RzL2xhdW5jaC5waHAiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5CZW4gSGFycGVyIFNldGxpc3RzPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5taW5kc2hhcmVkZXNpZ24uY29tL2JsYWNr +Y3Jvd2VzL3NldGxpc3RzLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIx +MDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5CbGFjayBDcm93cyBTZXRsaXN0 +cyAjMTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuYm9hLmNvbS9jZi90YXBl +c2VhcmNoLmNmbSIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkJsYWNrIENyb3dzIFNldGxpc3RzICMyPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5zZ2kubmV0L2JsdWVzdHJhdmVsZXIvU2V0 +bGlzdHMvZnJhbWUuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgx +NzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkJsdWVzIFRyYXZlbGVyIFNldGxpc3Rz +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5ibHVlc3RyYXZlbGVyLm5ldC9z +ZXRsaXN0LyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExB +U1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkJsdWVzIFRyYXZlbGVyIFN0YWdlIGFuZCBQcmUtc2hv +dyBTZXRsaXN0czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZXhwZWN0aW5n +cmFpbi5jb20vZG9rL3NldC90b3VybWFpbi5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+Qm9iIER5bGFu +IFNldGxpc3RzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5saXZlbWFybGV5 +LmNvbS9wZXJmb3JtLmh0bSIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgx +NzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkJvYiBNYXJsZXkgUGVyZm9ybWFuY2Vz +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5icnV1dWNlLmNvbS9zZXRsaXN0 +cy5odG0iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNU +X01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5CcnVjZSBIb3Juc2J5IFNldGxpc3RzPC9BPg0KICAgICAg +ICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5jaGFybGllaHVudGVyLmNvbS9zZXRsaXN0cy9pbmRl +eC5odG0iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNU +X01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5DaGFybGllIEh1bnRlciBTZXRsaXN0cyA8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmVudGVyYWN0LmNvbS9+cmZ1c3MvY2Nib290cy5o +dG1sIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9N +T0RJRklFRD0iMTA0MjY0Njg3NSI+Q291bnRpbmcgQ3Jvd3MgQm9vdGxlZyBHdWlkZTwvQT4NCiAg +ICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS9+c2F0ZWxsaXRlNzgv +IzIwMDAiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNU +X01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5Db3VudGluZyBDcm93cyBTZXRsaXN0cyAtIDI8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmRhcmtzdGFyb3JjaGVzdHJhLm5ldC9QYXN0 +X1NldGxpc3QuaHRtIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+RGFyayBTdGFyIE9yY2hlc3RyYSBTZXRsaXN0 +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5uYW5jaWVzLm9yZy9kbWJ0YS8i +IEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElG +SUVEPSIxMDQyNjQ2ODc1Ij5EYXZlIE1hdHRoZXdzIEJhbmQgU2V0bGlzdHM8L0E+DQogICAgICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vbWljaGVsZWouaG9tZS5taW5kc3ByaW5nLmNvbS9kZXJla2Jh +c2UvIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9N +T0RJRklFRD0iMTA0MjY0Njg3NSI+RGVyZWsgVHJ1Y2tzIEJhbmQ8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vd3d3LmRpc2NvYmlzY3VpdHMubmV0L3NldGxpc3RzLmh0bWwiIEFERF9E +QVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIx +MDQyNjQ2ODc1Ij5EaXNjbyBCaXNjdWl0cyBTZXRsaXN0czwvQT4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly93d3cuZ2FsYWN0aWNmdW5rLmNvbS9zZXRsaXN0cy9kZWZhdWx0LmFzcCIgQURE +X0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9 +IjEwNDI2NDY4NzUiPkdhbGFjdGljIFNldGxpc3RzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0i +aHR0cDovL3d3dy5tdWxlYmFzZS5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJ +VD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+R292J3QgTXVsZSBTZXRs +aXN0czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZGVhZGxpc3RzLmNvbS8i +IEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElG +SUVEPSIxMDQyNjQ2ODc1Ij5HcmF0ZWZ1bCBEZWFkTGlzdHM8L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vd3d3Lm9uZS1wZXJjZW50LmNvbS9ib290b2dyYXBoeS9qYW5lc19hZGRpY3Rp +b24vaW5kZXguc2h0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5KYW5lJ3MgQWRkaWN0aW9uIC0gQm9vdHM8 +L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmphenptYW5kb2xpbnByb2plY3Qu +Y29tL3NldHMuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkphenogTWFuZG9saW4gUHJvamVjdCBTZXRs +aXN0czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cudGhlamVycnlzaXRlLmNv +bS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01P +RElGSUVEPSIxMDQyNjQ2ODc1Ij5KZXJyeSBHYXJjaWEgU2V0bGlzdHM8L0E+DQogICAgICAgIDxE +VD48QSBIUkVGPSJodHRwOi8vd3d3LmplcnJ5am9zZXBoLmNvbS9TZXRsaXN0cy5odG1sIiBBRERf +REFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NSI+SmVycnkgSm9zZXBoICYgdGhlIEphY2ttb3Jtb25zIC0gU2V0bGlzdHM8L0E+ +DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmNvYm8ub3JnL2NnaS1sb2NhbC9zZXRs +aXN0cy9kYi5jZ2k/ZGI9ZGVmYXVsdCZ1aWQ9JnZpZXdfc2VhcmNoPTEiIEFERF9EQVRFPSIxMDQy +NjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1 +Ij5KaW1teSBCdWZmZXQgU2V0bGlzdHM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8v +d3d3Lmx1a2V3LmNvbS9rZHR1LyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEw +NDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkthcmwgRGVuc29uJ3MgVGlueSBV +bml2ZXJzZSBTZXRsaXN0czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuYm9v +dGxlZHouY29tL3NldGxpc3RzLmh0bSIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9 +IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkxlZCBaZXBwZWxpbiBTZXRs +aXN0czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly90aW5wYW4uZm9ydHVuZWNpdHku +Y29tL3NhaW50cy83NTIvbG9zX3NldGxpc3QvIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+TGVmdG92ZXIgU2Fs +bW9uIFNldGxpc3RzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5jcnlzdGFs +LW5pZ2h0LmNvbS9+YndpbGxlbi9NTVNldHMuaHRtIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+TW9kZXN0IE1v +dXNlIFNldGxpc3RzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5tb2VsaW5r +cy5jb20vc2V0bGlzdHMvaW5kZXguaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklT +SVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPk1vZSBTZXRsaXN0czwv +QT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9jYW51ZmVlbGl0LmNvbS9Sb2JlcnQvdG9v +c2V0bGlzdHMuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPk90aGVyIE9uZXMgU2V0bGlzdHM8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnBoaWx6b25lLmNvbS9waGlsYmFzZS8iIEFE +RF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVE +PSIxMDQyNjQ2ODc1Ij5QaGlsIExlc2ggU2V0bGlzdHM8L0E+DQogICAgICAgIDxEVD48QSBIUkVG +PSJodHRwOi8vb3Vyd29ybGQuY29tcHVzZXJ2ZS5jb20vaG9tZXBhZ2VzL1BGQXJjaGl2ZXMvdG91 +cmRhdGUuaHRtIzE5NzIiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5QaW5rIEZsb3lkIENvbmNlcnQgQXBwZWFy +YW5jZXM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnBmLXJvaW8uZGUvIiBB +RERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NSI+UGluayBGbG95ZCBST0lPPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0i +aHR0cDovL21lbWJlcnMuYW9sLmNvbS9SYXRCYXNlL2Zyb250cGFnZS5odG1sIiBBRERfREFURT0i +MTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0 +Njg3NSI+UmF0ZG9nIFNldGxpc3RzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL21l +bWJlcnMuYW9sLmNvbS9qd3RqdGEvcHJpbWFsc2NyZWFtLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2 +ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5S +dXN0ZWQgUm9vdCBTZXRsaXN0czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cu +dGhlc2FtcGxlcy5vcmcvc2V0bGlzdHMiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lU +PSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5TYW1wbGVzIFNldGxpc3Rz +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5zdHRmLmNvbS9zZWN0b3I5Mi5o +dG1sIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9N +T0RJRklFRD0iMTA0MjY0Njg3NSI+U2VjdG9yIDkgU2V0bGlzdHM8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vd3d3LnNldGxpc3QuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExB +U1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlNldGxpc3Qu +Q29tIEZvciBhbGwgeW91ciBzZXRsaXN0IG5lZWRzITwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9 +Imh0dHA6Ly9qYW0uYWJvdXQuY29tL211c2ljcGVyZm9ybS9qYW0vY3Mvc2V0bGlzdHMvaW5kZXgu +aHRtIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9N +T0RJRklFRD0iMTA0MjY0Njg3NSI+U2V0bGlzdHMgLSBBYm91dC5jb208L0E+DQogICAgICAgIDxE +VD48QSBIUkVGPSJodHRwOi8vZXhwZXJ0LmNjLnB1cmR1ZS5lZHUvfm1vaHJqL2Nkci9zb3VsaXZl +Lmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNU +X01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5Tb3VsaXZlIFNldGxpc3RzPC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL3d3dy5zdHJhbmdlZm9say5jb20vY29udGVudC9zZXRsaXN0L3NldGxp +c3RfZGIucGhwMyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlN0cmFuZ2Vmb2xrIFNldGxpc3RzPC9BPg0KICAg +ICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5mcmllbmRzb2ZjaGVlc2UuY29tL3NldGxpc3Rz +L2luZGV4LmFzcCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlN0cmluZyBDaGVlc2UgU2V0bGlzdHM8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnBvcmNocGFydHkuY29tL3NldGxpc3RzLmh0 +bSIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzUiPlRoZSBSZWNpcGUgU2V0bGlzdHM8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vd3d3LnUyc2V0bGlzdHMuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlUyIFNl +dGxpc3QgQXJjaGl2ZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZXZlcnlk +YXljb21wYW5pb24uY29tL2FzcC9kZWZhdWx0LmFzcCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExB +U1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPldpZGVzcHJl +YWQgUGFuaWMgU2V0bGlzdHM8L0E+DQogICAgPC9ETD48cD4NCiAgICA8RFQ+PEgzIEZPTERFRCBB +RERfREFURT0iMTA0MjY0Njg3NSI+U2hvcHBpbmc8L0gzPg0KICAgIDxETD48cD4NCiAgICAgICAg +PERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZmlnaHRkaXZ4LmNvbS9jb3Vwb25zLmh0bSIgQUREX0RB +VEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEw +NDI2NDY4NzUiPk9ubGluZSBEVkQgRGVhbHMgYW5kIENvdXBvbnM8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vdGVjaGJhcmdhaW5zLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBM +QVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij50ZWNoYmFy +Z2FpbnMuY29tPC9BPg0KICAgIDwvREw+PHA+DQogICAgPERUPjxIMyBGT0xERUQgQUREX0RBVEU9 +IjEwNDI2NDY4NzUiPlN0ZWFtaW5nIFR1bmVzPC9IMz4NCiAgICA8REw+PHA+DQogICAgICAgIDxE +VD48QSBIUkVGPSJodHRwOi8vd3d3LjN3ay5jb20vbGlzdHJlYWwuaHRtIiBBRERfREFURT0iMTA0 +MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3 +NSI+M1dLIFJlYWxQbGF5ZXI8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LjN3 +ay5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+M1dLIFVuZGVyZ3JvdW5kIFJhZGlvPC9BPg0KICAgICAg +ICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5ncmF0ZWZ1bGRheS5jb20vIiBBRERfREFURT0iMTA0 +MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3 +NSI+R3JhdGVmdWwgRGF5PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5zdWdh +cm1lZ3Mub3JnL2dyOGZ1bGRlYWRzbWlsLmh0bWwjZ2QiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBM +QVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5HcmF0ZWZ1 +bCBEZWFkIGFuZCBQaHJpZW5kcy0gU3RyZWFtaW5nIFJlYWwgQXVkaW8gRmlsZXM8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vdGhlaGlwLm9yZy9wdWIvYm9vdGxlZ3MvbXAzX3Nob3dz +LyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzUiPkhpcCBCb290cyAtIE1QMzwvQT4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly93d3cucnlhbmFkYW1zLmluZm8vcGxheWxpc3QuaHRtIiBBRERfREFURT0iMTA0 +NDU0OTAxNyIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0NDU0OTAx +NyI+SG9va2VkIG9uIFNvbmljcyBSYWRpbzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6 +Ly93d3cubGlzdGVuLmNvbS9saXN0ZW5ob21lLmpzcCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExB +U1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkxpc3Rlbjwv +QT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cubXVzaWNuZXZlcnN0b3BzLmNvbS9p +bmRleC5waHAzP2xzX3Nlc3Npb249MGQxYmNkZTE4N2FhNzkxZGE4MDE5ZmU1MTVjMjdkNjQiIEFE +RF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVE +PSIxMDQyNjQ2ODc1Ij5tdXNpY25ldmVyc3RvcHMuY29tPC9BPg0KICAgICAgICA8RFQ+PEEgSFJF +Rj0iaHR0cDovL3d3dy5vbnNoYXJlLmNvbS9ncm91cGxpc3QuanNwP2NhdGVnb3J5aWQ9MTYzNzQ0 +IiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJ +RklFRD0iMTA0MjY0Njg3NSI+T25TaGFyZSBHcm91cExpc3Rpbmc8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vd3d3LnRoZWJpZ3JpcG9mZi5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3 +NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+cmlw +LW9mZiByYWRpbyBAIHRoZWJpZ3JpcG9mZi5jb208L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJo +dHRwOi8vc3VnYXJtZWdzLm9yZy8xYTQvP009RCIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1Rf +VklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlN1Z2FybWVncy0g +c3RyZWFtczwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly90aGVqYW16b25lLmNvbS8i +IEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElG +SUVEPSIxMDQyNjQ2ODc1Ij5UaGUgSmFtIFpvbmUhIC0gQ29tZSBpbiBhbmQgZ3Jvb3ZlIHdpdGgg +dGhlIERlYWQsIFBoaXNoLCBQaW5rIEZsb3lkLCBEYXZlIE1hdHRoZXdzIGFuZCBtYW55IG90aDwv +QT4NCiAgICA8L0RMPjxwPg0KICAgIDxEVD48SDMgRk9MREVEIEFERF9EQVRFPSIxMDQyNjQ2ODc1 +Ij5UcmFkaW5nPC9IMz4NCiAgICA8REw+PHA+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8v +dHRjLmNvcnJ1cHQubmV0LyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgx +NzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPiN0YXBlX3RyYWRlX2NlbnRyYWwgLSBE +YWxuZXQncyBDb25jZXJ0IFRyYWRpbmcgQ2hhbm5lbDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9 +Imh0dHA6Ly93d3cuZGVzb2xhdGlvbnJvdy5jb20vY292ZXJzL2FydHdvcmsuaHRtbCIgQUREX0RB +VEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEw +NDI2NDY4NzUiPkJvYiBEeWxhbiBCb290bGVnIEFydHdvcms8L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vbWVtYmVycy50cmlwb2QuY29tL35EYXZlTUwvdHJhZGUtYXJ0Lmh0bSIgQURE +X0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9 +IjEwNDI2NDY4NzUiPkNELVIgVHJhZGluZyBCb290bGVnIENvdmVyIEFydCBMaW5rczwvQT4NCiAg +ICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9waG90b3MueWFob28uY29tL2JjL3dpdGVfa25pdGUv +bHN0PyYuZGlyPS9DRCtDT1ZFUitBUlQrLStPUklHSU5BTCYuc3JjPXBoJi5iZWdpbj05OTk5Ji52 +aWV3PXQmLm9yZGVyPSYuZG9uZT1odHRwJTNhLy9waG90b3MueWFob28uY29tL2JjL3dpdGVfa25p +dGUvbHN0JTNmJTI2LmRpcj0vQ0QlMmJDT1ZFUiUyYkFSVCUyYi0lMmJPUklHSU5BTCUyNi5zcmM9 +cGglMjYudmlldz10IiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+Q0RSIENvdmVycyAtIFlhaG9vISBQaG90b3Mg +LSBUaHVtYm5haWxzIFZpZXc8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmNk +cmluZm8uY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkNEUi1JbmZvLCBUaGUgUmVjb3JkaW5nIEF1dGhv +cml0eTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuY292ZXJ1bml2ZXJzZS5j +b20vIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9N +T0RJRklFRD0iMTA0MjY0Njg3NSI+Q292ZXJVbml2ZXJzZTwvQT4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly93d3cuZXRyZWUub3JnLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklT +SVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkV0cmVlLm9yZzwvQT4N +CiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZXRyZWVuZXdzLm9yZy4vaW5kZXgucGhw +IiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJ +RklFRD0iMTA0MjY0Njg3NSI+ZXRyZWVuZXdzLm9yZzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9 +ImZ0cDovL3RoZWhpcC5vcmcvcHViLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9 +IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPkhpcCBGVFA8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnUyLWZsb20uZGUvIiBBRERfREFURT0iMTA0MjY0 +Njg3NSIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+ +aHR0cC0td3d3LnUyLWZsb20uZGUtPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3 +dy5pbmhpZGluZy5jb20vaW5kZXguaHRtIiBBRERfREFURT0iMTA0MjY0Njg3NSIgTEFTVF9WSVNJ +VD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NSI+aSBuIGggaSBkIGkgbiBn +oCAuoCBjIG8gbTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cubXVzaWNuZXZl +cnN0b3BzLmNvbS9ldHJlZS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4 +MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5JbmRleCBvZiAtZXRyZWU8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmNkLXJvbWR1cGxpY2F0aW9uLmNvbS9pbmxh +eV90ZW1wbGF0ZS5odG0iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5JbmxheSBDYXJkIFRlbXBsYXRlPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5mb3J0dW5lY2l0eS5jby51ay9tYWRjaGVz +dGVyL2Jhc3MvMzc2L2luZGV4Lmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJU0lU +PSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5KdWxpYW4gRm93bGVyJ3Mg +Q0QgSmV3ZWwgQ2FzZSBJbnNlcnRzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3 +dy5uaWNrc3BpY2tzLmNvbS9zaGVsbC5odG0iIEFERF9EQVRFPSIxMDQyNjQ2ODc1IiBMQVNUX1ZJ +U0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc1Ij5OaWNrc1BpY2tzLmNv +bTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cub2x5bXB1cy1tb25zLmNvbS9q +YW5lLyIgQUREX0RBVEU9IjEwNDI2NDY4NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1Rf +TU9ESUZJRUQ9IjEwNDI2NDY4NzUiPk5vdGhpbmcncyBTaG9ja2luZzwvQT4NCiAgICAgICAgPERU +PjxBIEhSRUY9Imh0dHA6Ly93d3cucGFwZXJjZGNhc2UuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4 +NzUiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzUiPlBh +cGVyIENEIENhc2U8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnBmLXJvaW8u +ZGUvIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9N +T0RJRklFRD0iMTA0MjY0Njg3NiI+UGluayBGbG95ZCBST0lPPC9BPg0KICAgICAgICA8RFQ+PEEg +SFJFRj0iaHR0cDovL3NhdGl2YS5ldHJlZS5vcmcvIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+c2F0aXZhLmV0 +cmVlLm9yZyBob21lcGFnZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9pY2R3ZWIu +Y2MucHVyZHVlLmVkdS9+c2NyZWVjaC9pbmRleDIuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzYi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPlNjcmVl +Y2gncyBEb21haW48L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vZm9ydW0uc2hpbmJ1 +cm4uY29tL2luZGV4LnBocCIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgx +NzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPlNoaW5idXJuIC0gcG93ZXJlZCBieSBY +TUI8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vc2hudHVuZXMub3JnLyIgQUREX0RB +VEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEw +NDI2NDY4NzYiPnNobnR1bmVzLm9yZzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93 +d3cuZ2VvY2l0aWVzLmNvbS9TdW5zZXRTdHJpcC9DbHViLzY3NTIvcmV2ZW5nZS5odG1sIiBBRERf +REFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NiI+VGFwZXJzIFJldmVuZ2U8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vd3d3LnN3LWRlc2lnbnMuY29tL3RlbXBsYXRlcy5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3 +NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+VGVt +cGxhdGVzIENELVJPTSBMYWJlbHMsIENEIFRyYXkgQ2FyZHMsIENEIEluc2VydHMsIGFuZCBDRCBN +YWlsZXJzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5tZXRyb25vaXIuZjJz +LmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNU +X01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5XZWxjb21lIHRvIE1ldHJvcG9saXMgTm9pciAtIFlvdXIg +aG9tZSBmb3IgaGlnaCBxdWFsaXR5IEhpcDwvQT4NCiAgICA8L0RMPjxwPg0KICAgIDxEVD48SDMg +Rk9MREVEIEFERF9EQVRFPSIxMDQyNjQ2ODc2Ij5XQVAtV01MPC9IMz4NCiAgICA8REw+PHA+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmFsbG5ldGRldmljZXMuY29tL2ZhcS8iIEFE +RF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNUX01PRElGSUVE +PSIxMDQyNjQ2ODc2Ij5hbGxOZXREZXZpY2VzIC0tIFRoZSBXaXJlbGVzcyBGQVE8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm5va2lhLmNvbS93YXAvIiBBRERfREFURT0iMTA0 +MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3 +NiI+Tm9raWEgLSBXQVAgb24gV2ViPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2Rl +dmVsb3Blci5vcGVud2F2ZS5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+T3BlbndhdmUgRGV2ZWxvcGVy +IFByb2dyYW08L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm9wZW53YXZlLmNv +bS9pbmRleC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+T3BlbndhdmUgU3lzdGVtcyBJbmMuPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53aXJlbGVzc2luYW51dHNoZWxsLmNvbS93 +YXAvd21scmVmLnNodG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3 +NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+VGFnIFJlZmVyZW5jZSAtIFdpcmVsZXNz +IGluIGEgbnV0c2hlbGwuY29tPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3RhZ3Rh +Zy5jb20vc2l0ZS9pbmRleC5waHAzIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+VGFnVGFnLmNvbSAtKy0gRlJF +RSBXQVAgc2l0ZSBjb25zdHJ1Y3Rpb24gYW5kIGhvc3Rpbmc8L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vdHRlbXVsYXRvci5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+VFRlbXVsYXRvciAt +IFdBUCBlbXVsYXRvcjwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9jZWxscGhvbmVz +LmFib3V0LmNvbS9nYWRnZXRzL2NlbGxwaG9uZXMvY3Mvd2FwL2luZGV4Lmh0bT9ybms9cjEmdGVy +bXM9d2FwIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+V0FQIChXaXJlbGVzcyBhcHBsaWNhdGlvbiBwcm90b2Nv +bCkgLSBBYm91dC5jb208L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmdlbG9u +Lm5ldC8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ0IiBMQVNU +X01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5XQVAgYnJvd3NlciBAIEdlbG9uLm5ldDwvQT4NCiAgICAg +ICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnLyIgQUREX0RBVEU9IjEwNDI2 +NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYi +PldBUCBGb3J1bTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuYW55d2hlcmV5 +b3Vnby5jb20vd2FwL0luZGV4LnBvIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+V0FQIEhvbWUgLSBBbnl3aGVy +ZVlvdUdvLmNvbTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cubm5ncm91cC5j +b20vcmVwb3J0cy93YXAvIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3 +NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+V0FQIFVzYWJpbGl0eSBSZXBvcnQgRmll +bGQgU3R1ZHkgRmFsbCAyMDAwPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53 +YXAuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExB +U1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPldBUC5jb20gLSAtIFlvdXIgZ3VpZGUgdG8gdGhlIHdp +cmVsZXNzIEludGVybmV0LCB3YXAgcGhvbmVzLCB3YXAgc2VydmljZXMgYW5kIFBEQXM8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LndhcHRpZ2VyLmRlL3dhcHRpZ2VyLyIgQURE +X0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDQiIExBU1RfTU9ESUZJRUQ9 +IjEwNDI2NDY4NzYiPldhcFRpZ2VyIC0gV0FQIGVtdWxhdG9yPC9BPg0KICAgICAgICA8RFQ+PEEg +SFJFRj0iaHR0cDovL3d3dy53YXBkcml2ZS5jb20vRE9DUy9pbmRleC5odG1sIiBBRERfREFURT0i +MTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NCIgTEFTVF9NT0RJRklFRD0iMTA0MjY0 +Njg3NiI+V2VsY29tZSB0byBXQVBEcml2ZSAgRnJlZSBXQVAgc2l0ZXMgIFdBUCBuZXdzICBXTUwg +dHV0b3JpYWwgIFdBUCBnYXRld2F5czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93 +d3cud2lyZWxlc3NkZXZuZXQuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9 +IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPldpcmVsZXNzIERldmVsb3Bl +ciBOZXR3b3JrIC0gSG9tZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cud2Fw +cmVkaXJlY3QuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPldpcmVsZXNzIGluIGEgbnV0c2hlbGwuY29t +IC0gV0FQLCBTTVMsIGlNb2RlLCAzRywgQmx1ZXRvb3RoLCBWb3hNTCwgSjJNRTwvQT4NCiAgICAg +ICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93aXJlbGVzcy5hYm91dC5jb20vaW5kdXN0cnkvd2lyZWxl +c3MvaW5kZXguaHRtP3Juaz1jNCZ0ZXJtcz13YXAiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNU +X1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5XaXJlbGVzcyBJ +bmR1c3RyeSAtIEFib3V0LmNvbTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cu +d21sc2NyaXB0LmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5XTUxTY3JpcHQuY29tPC9BPg0KICAgICAg +ICA8RFQ+PEEgSFJFRj0iaHR0cDovL21vYmlsZS55YWhvby5jb20vcGhvbmUvdG91cj8ucHY9bWFp +biYucGc9MSYucGg9dHAiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5ZYWhvbyEgTW9iaWxlIC0gVG91cnM8L0E+ +DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vbW9iaWxlLnlhaG9vLmNvbS9waG9uZS9kaXIi +IEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElG +SUVEPSIxMDQyNjQ2ODc2Ij5ZYWhvbyEgTW9iaWxlPC9BPg0KICAgIDwvREw+PHA+DQogICAgPERU +PjxIMyBGT0xERUQgQUREX0RBVEU9IjEwNDI2NDY4NzYiPldlYiBEZXNpZ248L0gzPg0KICAgIDxE +TD48cD4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cucGxpbmtvLm5ldC80MDQvIiBB +RERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NiI+NDA0IFJlc2VhcmNoIExhYjwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9 +Imh0dHA6Ly93d3cuYWxpc3RhcGFydC5jb20vbWFpbi5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3 +NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+QSBM +aXN0IEFwYXJ0IEZvciBQZW9wbGUgV2hvIE1ha2UgV2Vic2l0ZXM8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vd3d3LmFzc2VtYmxlci5vcmcvIiBBRERfREFURT0iMTA0MjY0Njg3NiIg +TEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+QVNTRU1C +TEVSLk9SRyA9IE1ha2luZyBBcnQgV2l0aCBNYWNoaW5lIENvZGU7PC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL2JvYmJ5LmNhc3Qub3JnL2JvYmJ5L2h0bWwvZW4vaW5kZXguanNwIiBB +RERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NiI+Qm9iYnkgVmFsaWRhdG9yPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0i +aHR0cDovL3d3dy5ib3hlc2FuZGFycm93cy5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+Qm94ZXMgYW5k +IEFycm93cyBCZWNhdXNlIHdlIGNhbjwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93 +d3cuY2hhbWkuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPkNoYW1pLmNvbSAtIEhUTUwtS2l0LCBldGMu +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2hvbWUuY25ldC5jb20vd2ViYnVpbGRp +bmcvMC03NjkwLmh0bWw/dGFnPXN0LmJsLjM4ODEuZGlyMS43NjkwIiBBRERfREFURT0iMTA0MjY0 +Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+ +Q05FVC5jb20gLSBXZWIgQnVpbGRpbmcgLSBTdHVwaWQgV2ViIFRyaWNrczwvQT4NCiAgICAgICAg +PERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuY29sb3JzY2hlbWVyLmNvbS9vbmxpbmUvIiBBRERfREFU +RT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0 +MjY0Njg3NiI+Q29sb3IgU2NoZW1lciAtIE9ubGluZSBDb2xvciBTY2hlbWUgR2VuZXJhdG9yPC9B +Pg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2J1aWxkZXIuY25ldC5jb20vd2ViYnVpbGRp +bmcvMC0zODg1LTgtNDUwMDAzMS0xLmh0bWw/dGFnPXN0LmJsLjM4ODUuZGlyMS4zODg1LTgtNDUw +MDAzMSIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1Rf +TU9ESUZJRUQ9IjEwNDI2NDY4NzYiPkNvbnRyYWN0cyBmb3IgZXZlcnkgb2NjYXNpb24gLSBXZWIg +QnVpbGRpbmcgLSBDTkVULmNvbTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9tc2Ru +Lm1pY3Jvc29mdC5jb20vd29ya3Nob3AvYXV0aG9yL2Nzcy9yZWZlcmVuY2UvYXR0cmlidXRlcy5h +c3AiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01P +RElGSUVEPSIxMDQyNjQ2ODc2Ij5DU1MgQXR0cmlidXRlcyBSZWZlcmVuY2U8L0E+DQogICAgICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Mi5pbWFnaXdhcmUuY29tL1J4SFRNTC8iIEFERF9EQVRF +PSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQy +NjQ2ODc2Ij5Eb2N0b3IgSFRNTCB2NjwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9l +dm9sdC5vcmcvaW5kZXguaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEw +NDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPmV2b2x0Lm9yZyAgV29ya2VycyBv +ZiB0aGUgV2ViLCBFdm9sdCE8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmZs +YXNoOTlnb29kLmNvbS9pbmRleF9mbGFzaC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+Rmxhc2ggOTkl +IEdvb2QuIEZpcnN0IEFpZCBNYW51YWwgRm9yIFVzYWJsZSBGbGFzaCBTaXRlczwvQT4NCiAgICAg +ICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9yOTM3LmNvbS9mcWEuY2ZtIiBBRERfREFURT0iMTA0MjY0 +Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+ +RnJlcXVlbnQgUXVlc3Rpb25zIEFuc3dlcmVkIC0tIHI5MzcuY29tPC9BPg0KICAgICAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL3d3dy5nbGlzaC5jb20vY3NzLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPmdsaXNo +LmNvbSAgQ1NTIGxheW91dCB0ZWNobmlxdWVzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0 +cDovL2RlZXppbi5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3 +NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+R3JhcGhpYyBEZXNpZ24gUmVzb3VyY2Vz +IENlbnRlciAtIEdyYXBoaWMgZGVzaWduIHR1dG9yaWFscywgZ3JhcGhpY3MgdGlwcywgd2ViIGRl +c2lnbiBhcnRpY2xlcyw8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lmh0bWxo +ZWxwLmNvbS9yZWZlcmVuY2UvY3NzLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9 +IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPkd1aWRlIHRvIENhc2NhZGlu +ZyBTdHlsZSBTaGVldHM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lmd1aXN0 +dWZmLmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBM +QVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5HVUlTdHVmZi5jb20gLSBGcmVlIEdyYXBoaWNhbCBV +c2VyIEludGVyZmFjZXM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmRldmVs +b3Blci5pcnQub3JnL3NjcmlwdC93aW5kb3cuaHRtIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+aXJ0Lm9yZyAt +IEphdmFTY3JpcHQgV2luZG93cyBGQVEgS25vd2xlZGdlIEJhc2U8L0E+DQogICAgICAgIDxEVD48 +QSBIUkVGPSJodHRwOi8vd3d3LnhzNGFsbC5ubC9+cHBrL2pzL2luZGV4Lmh0bWwiIEFERF9EQVRF +PSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQy +NjQ2ODc2Ij5KYXZhU2NyaXB0IFNlY3Rpb24gLSBIb21lcGFnZTwvQT4NCiAgICAgICAgPERUPjxB +IEhSRUY9Imh0dHA6Ly93d3cuampnLm5ldC9pYS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNU +X1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5qamcubmV0IGlu +Zm9ybWF0aW9uIGFyY2hpdGVjdHVyZSByZXNvdXJjZXM8L0E+DQogICAgICAgIDxEVD48QSBIUkVG +PSJodHRwOi8vd3d3LnNob3Jld2Fsa2VyLmNvbS9wYWdlcy9saWdodGhvdXNlX2luZGV4Lmh0bWwi +IEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElG +SUVEPSIxMDQyNjQ2ODc2Ij5MaWdodGhvdXNlIGxhdGVzdDwvQT4NCiAgICAgICAgPERUPjxBIEhS +RUY9Imh0dHA6Ly93d3cud2Vic2l0ZS1hbmFseXN0LmNvLmlsL2x1Y2Rlc2svbHVjZGVzay5odG1s +IiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJ +RklFRD0iMTA0MjY0Njg3NiI+THVjRGVzayAtIEluZm9ybWF0aW9uIERlc2lnbiAuIFdlYiBVc2Fi +aWxpdHkgLiBVc2VyIEV4cGVyaWVuY2U8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8v +d3d3Lm1lZGlhaW5zcGlyYXRpb24uY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklT +SVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPm1lZGlhIGluc3BpcmF0 +aW9uPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL21vcmVjcmF5b25zLmNvbS9pbmRl +eC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+bW9yZSBjcmF5b25zIGNvbG9ycyBmb3Igd2ViIGRlc2ln +bmVyczwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cudi0yLm9yZy9pbmRleC5o +dG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9N +T0RJRklFRD0iMTA0MjY0Njg3NiI+bXkgZ29kLi4uaXQncyBwaGlsaXBwZSBzdGFyY2suLi4gIHYt +MiBvcmdhbmlzYXRpb248L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vY29tcHV0aW5n +Lm5ldHNjYXBlLmNvbS9jb21wdXRpbmcvZGV2ZWxvcGVyL21haW4udG1wbCIgQUREX0RBVEU9IjEw +NDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4 +NzYiPk5ldHNjYXBlIC0gRGV2ZWxvcGVyPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDov +L3d3dy5vcmVpbGx5bmV0LmNvbS9qYXZhc2NyaXB0LyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExB +U1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPk8nUmVpbGx5 +IE5ldHdvcmsgSmF2YXNjcmlwdCBhbmQgQ1NTIERldkNlbnRlcjwvQT4NCiAgICAgICAgPERUPjxB +IEhSRUY9Imh0dHA6Ly93d3cucGRuLXBpeC5jb20vcGl4L2NvbHVtbi8iIEFERF9EQVRFPSIxMDQy +NjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2 +Ij5QRE4ncyBQSVggLSBzZWNvbmQgc2l0ZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6 +Ly93d3cucGRuLXBpeC5jb20vcGl4LyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9 +IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPlBETidzIFBJWCAtIFRIRSBN +QUdBWklORSBGT1IgVklTVUFMIENSRUFUSVZFUzwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0 +dHA6Ly93d3cucGlyYXRlZC1zaXRlcy5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+UGlyYXRlZCBTaXRl +cyEhIEFhYXJyZ2doaC4uLjwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cucGly +YXRlZC1zaXRlcy5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3 +NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+UGlyYXRlZCBTaXRlcyE8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmRyZWFtd2VhdmVyLWV4dGVuc2lvbnMuY29tLyIg +QUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzYiPlJhYmkncyBEcmVhbXdlYXZlciBFeHRlbnNpb25zPC9BPg0KICAgICAg +ICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53ZWJndWlsZC5vcmcvY29udGVzdC8iIEFERF9EQVRF +PSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQy +NjQ2ODc2Ij5TaWxpY29uIFZhbGxleSBXZWJHdWlsZCBXZWIgU2l0ZSBEZXNpZ24gQ29udGVzdDwv +QT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuc2ltcGx5dGhlYmVzdHNjcmlwdHMu +Y29tL2phdmFzY3JpcHRzLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgx +NzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPlNpbXBseXRoZUJlc3QgSmF2YXNjcmlw +dHMsIEpBVkEgU2NyaXB0czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuc2l0 +ZXBvaW50LmNvbS8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1 +IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5TaXRlUG9pbnQuY29tIC0gSGVscGluZyBCdXNp +bmVzcyBHcm93IE9ubGluZSE8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnRl +YW1waG90b3Nob3AuY29tL3Bob3Rvc2hvcC90dXRvcmlhbHMvcHNfdHV0X3RlY2huaXF1ZXMucGhw +IyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzYiPnRlYW1waG90b3Nob3AuY29tPC9BPg0KICAgICAgICA8RFQ+PEEg +SFJFRj0iaHR0cDovL3d3dy53ZWJzdGFuZGFyZHMub3JnLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYi +IExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPlRoZSBX +ZWIgU3RhbmRhcmRzIFByb2plY3QgRmlnaHRpbmcgZm9yIFN0YW5kYXJkcyBpbiBvdXIgQnJvd3Nl +cnM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vdG9tYWxhay5vcmcvIiBBRERfREFU +RT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0 +MjY0Njg3NiI+VG9tYWxhaydzIFJlYWxtICBEYWlseSBMaW5rcyB0byBTdHJhdGVnaWMgV2ViIERl +c2lnbiBOZXdzPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5qdWljeXN0dWRp +by5jb20vdHV0b3JpYWxzLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIx +MDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5UdXRvcmlhbHM8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnVzYWJpbGl0eS5nb3YvIiBBRERfREFURT0iMTA0 +MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3 +NiI+VXNhYmlsaXR5LmdvdiAtIFByb3ZpZGVkIGJ5IHRoZSBOQ0kgTmF0aW9uYWwgQ2FuY2VyIElu +c3RpdHV0ZTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly91c2FibGV3ZWIuY29tLyIg +QUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzYiPlVzYWJsZSBXZWI8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vd3d3LnZpc2lib25lLmNvbS9jb2xvcmxhYi8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNU +X1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5WaXNpQm9uZSBX +ZWJtYXN0ZXIncyBDb2xvciBMYWI8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vdmFs +aWRhdG9yLnczLm9yZy8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5XM0MgSFRNTCBWYWxpZGF0aW9uIFNlcnZp +Y2U8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lnczc2Nob29scy5jb20vZGVm +YXVsdC5hc3AiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBM +QVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5XM1NjaG9vbHMgT25saW5lIFdlYiBUdXRvcmlhbHM8 +L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm11bmRpZGVzaWduLmNvbS93ZWJj +dC93ZWJjdC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+V2ViIENvbG9yIFRoZW9yeTwvQT4NCiAgICAg +ICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZC51bW4uZWR1L2l0c3Mvc3VwcG9ydC9UcmFpbmlu +Zy9PbmxpbmUvd2ViZGVzaWduLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEw +NDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPldlYiBEZXNpZ24gUmVmZXJlbmNl +czwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuc3RhcnMuY29tLyIgQUREX0RB +VEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEw +NDI2NDY4NzYiPldlYiBEZXZlbG9wZXIncyBWaXJ0dWFsIExpYnJhcnkgRW5jeWNsb3BlZGlhIG9m +IFdlYiBEZXNpZ24gVHV0b3JpYWxzLCBBcnRpY2xlcyBhbmQgRGlzY3Vzc2lvbnM8L0E+DQogICAg +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LndwZGZkLmNvbS93cGRob21lLmh0bSIgQUREX0RB +VEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEw +NDI2NDY4NzYiPldlYiBQYWdlIERlc2lnbiBmb3IgRGVzaWduZXJzIC0gSG9tZSBQYWdlPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53ZWJzaXRlc3RoYXRzdWNrLmNvbS9pbmRl +eC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+V2ViIFBhZ2VzIFRoYXQgU3VjazwvQT4NCiAgICAgICAg +PERUPjxBIEhSRUY9Imh0dHA6Ly93ZWJzaXRlZ2FyYWdlLm5ldHNjYXBlLmNvbS8iIEFERF9EQVRF +PSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQy +NjQ2ODc2Ij5XZWIgU2l0ZSBHYXJhZ2U8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8v +d3d3LmthdHN1ZXlkZXNpZ253b3Jrcy5jb20vd21wX2luZGV4Lmh0bSIgQUREX0RBVEU9IjEwNDI2 +NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYi +PldlYiBUaXBlczwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cud2VibWFzdGVy +YmFzZS5jb20vIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIg +TEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+V2VibWFzdGVyQmFzZSAtIEhlbHBpbmcgQnVzaW5l +c3MgR3JvdyBPbmxpbmU8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vaG90d2lyZWQu +bHljb3MuY29tL3dlYm1vbmtleS9yZWZlcmVuY2UvY29sb3JfY29kZXMvIiBBRERfREFURT0iMTA0 +MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3 +NiI+V2VibW9ua2V5ICBSZWZlcmVuY2UgQ29sb3IgQ29kZXM8L0E+DQogICAgICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vaG90d2lyZWQubHljb3MuY29tL3dlYm1vbmtleS9nbG9zc2FyeS8iIEFERF9E +QVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIx +MDQyNjQ2ODc2Ij5XZWJtb25rZXkgIFJlZmVyZW5jZSBHbG9zc2FyeTwvQT4NCiAgICAgICAgPERU +PjxBIEhSRUY9Imh0dHA6Ly9ob3R3aXJlZC5seWNvcy5jb20vd2VibW9ua2V5L3JlZmVyZW5jZS9o +dG1sX2NoZWF0c2hlZXQvaW5kZXguaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklT +SVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPldlYm1vbmtleSAgUmVm +ZXJlbmNlIEhUTUwgQ2hlYXRzaGVldDwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9o +b3R3aXJlZC5seWNvcy5jb20vd2VibW9ua2V5L3JlZmVyZW5jZS9zcGVjaWFsX2NoYXJhY3RlcnMv +IiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJ +RklFRD0iMTA0MjY0Njg3NiI+V2VibW9ua2V5ICBSZWZlcmVuY2UgU3BlY2lhbCBDaGFyYWN0ZXJz +PC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2hvdHdpcmVkLmx5Y29zLmNvbS93ZWJt +b25rZXkvIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFT +VF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+V2VibW9ua2V5PC9BPg0KICAgICAgICA8RFQ+PEEgSFJF +Rj0iaHR0cDovL3d3dy53ZWJyZXZpZXcuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1Rf +VklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPldlYlJldmlldy5j +b208L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LndlYndvcmQuY29tL2hvdHNp +dGVzLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBM +QVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5XZWJXb3JkLmNvbSBIb3QgV2ViIFNpdGVzPC9BPg0K +ICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5zaXRlY3JpdGlxdWUubmV0L2luZGV4LnBo +cCIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzYiPldlbGNvbWUgdG8gU2l0ZUNyaXRpcXVlLm5ldCAtIEhlbHBpbmcg +WW91IENyZWF0ZSBCZXR0ZXIgRGVzaWducyBUaHJvdWdoIEZyaWVuZGx5IEFkdmljZSE8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm5yMXdlYnJlc291cmNlLmNvbS9pbmRleC5o +dG0iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01P +RElGSUVEPSIxMDQyNjQ2ODc2Ij5XZWxjb21lIHRvIFdlYiBSZXNvdXJjZXMgLSBXaGVyZSBXZWJU +ZWNobm9sb2d5IG1lZXRzIFNpbXBsaWNpdHk8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vd3d3LnpkbmV0LmNvbS9kZXZoZWFkL2ZpbHRlcnMvMCw5NDI5LDIxMzMyMjQsMDAuaHRtbCIg +QUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzYiPlpETmV0IGQgZSB2IGUgbCBvIHAgZSByICBVc2FiaWxpdHk8L0E+DQog +ICAgPC9ETD48cD4NCiAgICA8RFQ+PEgzIEZPTERFRCBBRERfREFURT0iMTA0MjY0Njg3NiI+V05Z +TXVzaWM8L0gzPg0KICAgIDxETD48cD4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cu +d255bXVzaWMuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPkJ1ZmZhbG8gTXVzaWMgT25saW5lIC0gV255 +bXVzaWMuY29tPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53bnltdXNpYy5j +b20vYm9hcmQvY2dpLWJpbi9VbHRpbWF0ZS5jZ2k/YWN0aW9uPWludHJvJkJ5cGFzc0Nvb2tpZT10 +cnVlIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9N +T0RJRklFRD0iMTA0MjY0Njg3NiI+QnVmZmFsbyBNdXNpYyBPbmxpbmUgTWVzc2FnZSBCb2FyZDwv +QT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cud255bXVzaWMuY29tL2JvYXJkL05v +bkNHSS9jcC5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0 +NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+VWx0aW1hdGUgQnVsbGV0aW4gQm9hcmQgLSBD +b250cm9sIFBhbmVsIEZyYW1lPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53 +bnltdXNpYy5jb20vbGlzdC5waHAzIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+V05ZTXVzaWMgLSBUaGUgTGlz +dDwvQT4NCiAgICA8L0RMPjxwPg0KICAgIDxEVD48SDMgRk9MREVEIEFERF9EQVRFPSIxMDQyNjQ2 +ODc2Ij5aaXB6YXBzPC9IMz4NCiAgICA8REw+PHA+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vc2VhcmNoLWRlc2MuZWJheS5jb20vc2VhcmNoL3NlYXJjaC5kbGw/R2V0UmVzdWx0JnN0PTIm +U29ydFByb3BlcnR5PU1ldGFFbmRTb3J0JnF1ZXJ5PXppcHphcCZzcmNoZGVzYz15JmZyb209Ujcm +ZWJheXRhZzE9ZWJheXJlZyZodD0xJmNvbWJpbmU9eSIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExB +U1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPkViYXkgLSBJ +dGVtcyBtYXRjaGluZyAoIHppcHphcCApPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0iaHR0cDov +L3d3dy5sYXRlbmN5cHJvamVjdC5jb20vemlwemFwcy96aXB6YXByYWNpbmcuaHRtbCIgQUREX0RB +VEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEw +NDI2NDY4NzYiPmxhdGVuY3lwcm9qZWN0LmNvbSAtIHppcCBtb2RzIGFuZCByYWNpbmc8L0E+DQog +ICAgICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm1pY3JvcmNjZW50ZXIuY29tLyIgQUREX0RB +VEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEw +NDI2NDY4NzYiPk1pY3JvIFJDIENhcnMgQ2VudGVyPC9BPg0KICAgICAgICA8RFQ+PEEgSFJFRj0i +aHR0cDovL3d3dy5taWNyb3JjY2VudGVyLmNvbS9mb3J1bS9pbmRleC5waHA/cz03YWEwNTYyMTQ2 +NWVhMzQ0NjQ3YmE5MDY4YWExODlkNyZhY3Q9U0YmZj01IiBBRERfREFURT0iMTA0MjY0Njg3NiIg +TEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+TWljcm8g +UkMgQ2FycyBGb3J1bTwvQT4NCiAgICAgICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cucmFkaW9z +aGFjay5jb20vUGFydG5lcnMvWmlwWmFwcy9aaXBaYXBzSG9tZS5hc3AiIEFERF9EQVRFPSIxMDQy +NjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2 +Ij5SYWRpb3NoYWNrLmNvbSAtIFppcFphcHM8L0E+DQogICAgICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vd3d3LnRpbnlyYy5jb20vZm9ydW1zL2ZvcnVtZGlzcGxheS5waHA/cz0mZm9ydW1pZD03NSIg +QUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJ +RUQ9IjEwNDI2NDY4NzYiPlRpbnlSQy5jb20gLSBaaXBaYXBzPC9BPg0KICAgICAgICA8RFQ+PEEg +SFJFRj0iaHR0cDovL3d3dy50aW55cmMuY29tLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1Rf +VklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPlRpbnlSQy5jb208 +L0E+DQogICAgPC9ETD48cD4NCiAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL2RtLmRlc2ttb2QuY29t +LyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9E +SUZJRUQ9IjEwNDI2NDY4NzYiPi5bRGVza01vZCAtIFlvdXIgU291cmNlIGZvciBEZXNrdG9wIE1v +ZGlmaWNhdGlvbl0uPC9BPg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmFsdC1waHAtZmFx +Lm9yZy9sb2NhbC83NS9saW5rcy5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJ +VD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+QUxULVBIUC1GQVEgLSBI +b3cgZG8gSSB0dXJuIG5ld2xpbmVzIC0gcmV0dXJucyBpbnRvIGh0bWwgYnJlYWtzIChicik8L0E+ +DQogICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuYmFieWNlbnRyZS5jby51ay9yZWZjYXAvNDE4 +OC5odG1sIiBBRERfREFURT0iMTA0MzM0NjA2MCIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFT +VF9NT0RJRklFRD0iMTA0MzM0NjA2MCI+QmFieUNlbnRyZSAgRGFkcycgc3R1ZmYgRGlldCBmb3Ig +YSBoZWFsdGh5IGZhdGhlci10by1iZTwvQT4NCiAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5i +YWJ5Y2VudHJlLmNvLnVrL3RyeWluZ2ZvcmJhYnkiIEFERF9EQVRFPSIxMDQzMzQ2MTQwIiBMQVNU +X1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQzMzQ2MTQwIj5CYWJ5Q2VudHJl +ICBUcnlpbmcgZm9yIGEgYmFieTwvQT4NCiAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3N3ei1idXNp +bmVzc3dlZWsuc2FsYXJ5LmNvbS9zYWxhcnl3aXphcmQvbGF5b3V0c2NyaXB0cy9zd3psX2NvbXBy +ZXN1bHQuYXNwP3ppcGNvZGU9MTQyMjMmbmFycm93Y29kZT1JVDAzJmdlbz1CdWZmYWxvJTJDK05Z +KzE0MjIzJmpvYmNvZGU9SVQxMDAwMDE1MyZqb2J0aXRsZT1XZWJtYXN0ZXImaW1hZ2UxLng9NTEm +aW1hZ2UxLnk9MTciIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1 +IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5CdXNpbmVzcyBXZWVrIE9ubGluZSBTYWxhcnkg +V2l6YXJkPC9BPg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmNvcHlsZWZ0Lm5ldC9pbmRl +eC5waHRtbD9keW5hbWljPTEmcmVmZXJlcj0lMkZpdGVtLnBodG1sJTNGJTI2cGFnZSUzRHByb2R1 +Y3RfMTA3NV9mcm9udC5waHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEw +NDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPkNvcHlsZWZ0Lm5ldCAtIEdlZWsg +Q2hpYyE8L0E+DQogICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZG9tYWdnaW9yZS5pdC9pbmRl +eC5odG1sIiBBRERfREFURT0iMTA0MzY5MjQ0MiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFT +VF9NT0RJRklFRD0iMTA0MzY5MjQ0MiI+Q292ZXJhbGwgQ0QgQXVkaW8gQ292ZXJzPC9BPg0KICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmNzLnV0YWguZWR1L2RlcHQvb2xkL3RleGluZm8vY3Zz +L2N2c190b2MuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2 +NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPkNWUy0tQ29uY3VycmVudCBWZXJzaW9ucyBT +eXN0ZW0gLSBUYWJsZSBvZiBDb250ZW50czwvQT4NCiAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3 +dy5ic3lzLnRzdWt1YmEuYWMuanAvfmp1bnlhL2R0Ym9vdHMvMDktbG91ZC5odG1sIiBBRERfREFU +RT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0 +MjY0Njg3NiI+RHJlYW0gVGhlYXRlciAtIEltcGF4eCA1LjE4LjkzIC0gRHJlYW0gT3V0IExvdWQ8 +L0E+DQogICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuZXZyc29mdC5jb20vZmFzdHN1Ym1pdC8i +IEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElG +SUVEPSIxMDQyNjQ2ODc2Ij5GYXN0U3VibWl0IC0gU3VibWl0IHlvdXIgd2Vic2l0ZSB0byBzZWFy +Y2ggZW5naW5lcyBmb3IgRlJFRSE8L0E+DQogICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuc3Rh +bmZvcmQuZWR1L2dyb3VwL3BhbmRlZ3JvdXAvQ29zbS9pbmRleC5odG1sIiBBRERfREFURT0iMTA0 +MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3 +NiI+Rm9sZGluZ0Bob21lPC9BPg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vZWNhbGFtZS50cmlw +b2QuY29tL2ZyZWUuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgx +NzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPkZyZWUgTmV3cyBTZXJ2ZXJzPC9BPg0K +ICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmZyZWV3YXJlcGFsbS5jb20vIiBBRERfREFURT0i +MTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0 +Njg3NiI+RnJlZXdhcmVQYWxtPC9BPg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LmJ1ZmZh +bG9uZXQub3JnLyIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUi +IExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPkhpc3Rvcnkgb2YgQnVmZmFsbywgTmV3IFlvcms8 +L0E+DQogICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cudGFjb3NoZWxsLmNvbS9zcGluYWxjcmFj +a2VyL2NnaS1iaW4vc2VhcmNoLnBsP2luZGV4IiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9W +SVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+aW50ZXJuZXQgYmVh +dGxlcyByZWNvcmRpbmcgaW5kZXggbWFpbiBwYWdlPC9BPg0KICAgIDxEVD48QSBIUkVGPSJodHRw +Oi8vZGV2ZWxvcGVyLmlydC5vcmcvc2NyaXB0L2RodG1sLmh0bSIgQUREX0RBVEU9IjEwNDI2NDY4 +NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPmly +dC5vcmcgLSBEeW5hbWljIEhUTUwgRkFRIEtub3dsZWRnZSBCYXNlPC9BPg0KICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vZGV2ZWxvcGVyLmlydC5vcmcvc2NyaXB0L3RhYmxlLmh0bSIgQUREX0RBVEU9 +IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2 +NDY4NzYiPmlydC5vcmcgLSBKYXZhU2NyaXB0IFRhYmxlIEZBUSBLbm93bGVkZ2UgQmFzZTwvQT4N +CiAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2ti +L2FydGljbGVzL1ExMjYvNC80OS5hc3AiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lU +PSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5LZXlib2FyZCBTaG9ydGN1 +dHMgZm9yIFdpbmRvd3M8L0E+DQogICAgPERUPjxBIEhSRUY9Imh0dHA6Ly9ob21lcGFnZS5tYWMu +Y29tL2xlcGVyb3VzL1Bob3RvQWxidW0xLmh0bWwiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNU +X1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5Lbm93IFlvdXIg +UGxhY2UhIFNodXQgWW91ciBGYWNlITwvQT4NCiAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5n +ZW5lc2lzLXBhdGguY29tL2xhbWJzdHVmZi5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFT +VF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+TGFtYiBzdHVm +ZiE8L0E+DQogICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cuYml6dWJjb21tLmNvbS9MaWJlcnR5 +QmVsbC9NaXNjLi5odG0iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0 +NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5NaXNjLiBTcGFjZSBMaXN0PC9BPg0KICAg +IDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaXNhcGkvcmVkaXIuZGxsP3By +ZD1pZSZwdmVyPTYmYXI9SVN0YXJ0IiBBRERfREFURT0iMTA0MTI2NTc5MiIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MTI2NTgxMiI+TVNOLmNvbTwvQT4NCiAgICA8 +RFQ+PEEgSFJFRj0iaHR0cDovL3Zpc2libGVlYXJ0aC5uYXNhLmdvdi8iIEFERF9EQVRFPSIxMDQy +NjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2 +Ij5OQVNBJ3MgVmlzaWJsZSBFYXJ0aDwvQT4NCiAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5k +ZWJyaXMuY29tL2pvdXJuYWwvMTM0IiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0i +MTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+T3B0LU91dDwvQT4NCiAgICA8 +RFQ+PEEgSFJFRj0iaHR0cDovL2RvY3MucG9ydGFsLmRldi8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2 +IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5Qb3J0 +YWwgRG9jcyAgVE9DPC9BPg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5j +b20vaXNhcGkvcmVkaXIuZGxsP3ByZD13aW5kb3dzJnNicD1tZWRpYXBsYXllciZwbGNpZD0mcHZl +cj02LjEmb3M9Jm92ZXI9Jm9sY2lkPSZjbGNpZD0mYXI9TWVkaWEmc2JhPVJhZGlvQmFyJm8xPSZv +Mj0mbzM9IiBBRERfREFURT0iMTA0MTI2NTc5MiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFT +VF9NT0RJRklFRD0iMTA0MTI2NTgxMiI+UmFkaW8gU3RhdGlvbiBHdWlkZTwvQT4NCiAgICA8RFQ+ +PEEgSFJFRj0iaHR0cDovL3d3dy5yZXN0b3JhdGlvbmNlbnRyYWwuY29tL2luZGV4Lmh0bWwiIEFE +RF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVE +PSIxMDQyNjQ2ODc2Ij5SZXN0b3JhdGlvbiBDZW50cmFsIEhvbWUsIG51cnR1cmluZyB0aGUgcGFz +c2lvbiBmb3IgYW50aXF1ZXMgYW5kIG9sZCBob21lcyB3aXRoIGFuIEFydHMgJiBDcmFmdDwvQT4N +CiAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5mYWJ1bG91c2Zvb2RzLmNvbS9ob2xpZGF5cy9o +YWxsb3dlZW4vcHVtcHBsYW5zMi5odG1sIiBBRERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJ +VD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+Um9jayBhbmQgUm9sbCBQ +dW1wa2luIENhcnZpbmcgUGF0dGVybnM8L0E+DQogICAgPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cu +c2ZuMi5jb20vZm9ydW0vaG9tZS5waHAiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lU +PSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5TdGVybkZhbk5ldHdvcmsg +SG9tZSBQYWdlPC9BPg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnN3aG9pcy5uZXQvIiBB +RERfREFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklF +RD0iMTA0MjY0Njg3NiI+U1dob2lzLm5ldDwvQT4NCiAgICA8RFQ+PEEgSFJFRj0iaHR0cDovL3Nj +b3V0MTguY3Mud2lzYy5lZHUvbmV0LW5ld3MvOTgtMDYvOTgtMDYtMjIvMDAxMC5odG1sIiBBRERf +REFURT0iMTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0i +MTA0MjY0Njg3NiI+VGhlIExhd3llcnMgV2hvIEdldCBJdCBSaWdodCAtIEpheSBHZXJsYW5kPC9B +Pg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnRoaW5rZ2Vlay5jb20vIiBBRERfREFURT0i +MTA0MjY0Njg3NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0 +Njg3NiI+VGhpbmtHZWVrICBTdHVmZiBmb3IgU21hcnQgTWFzc2VzPC9BPg0KICAgIDxEVD48QSBI +UkVGPSJodHRwOi8vam9ic2VhcmNoLm5ldHNjYXBlLm1vbnN0ZXIuY29tL2dldGpvYi5hc3A/Sm9i +SUQ9MTMyOTQxNzMmY29sPSZjeT0mYnJkPSZsaWQ9NTQ2JmZuPTYmcT0mQVZTRE09MjAwMSUyRDEx +JTJEMTUrMTYlM0EyNCUzQTAwJTJFMDAwJkNDRD1teSUyRW5ldHNjYXBlJTJFbW9uc3RlciUyRWNv +bSZKU0Q9am9ic2VhcmNoJTJFbmV0c2NhcGUlMkVtb25zdGVyJTJFY29tJkhEPWNvbXBhbnklMkVu +ZXRzY2FwZSUyRW1vbnN0ZXIlMkVjb20mQUQ9aHR0cCUzQSUyIiBBRERfREFURT0iMTA0MjY0Njg3 +NiIgTEFTVF9WSVNJVD0iMTA0ODE3NDY0NSIgTEFTVF9NT0RJRklFRD0iMTA0MjY0Njg3NiI+VVMt +TlktQnVmZmFsby1XZWIgRGV2ZWxvcGVyPC9BPg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3 +LmV2cnNvZnQuY29tL3dlYm1hZy8iIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIx +MDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5XZWJNYWcgT25saW5lIC0gVGhl +IE5vIzEgUmVzb3VyY2UgZm9yIFdlYiBCdWlsZGVyczwvQT4NCiAgICA8RFQ+PEEgSFJFRj0iaHR0 +cDovL2FtYXppbmdmb3J1bXMuY29tL2ZvcnVtL0lNTk9CT0RZL2ZvcnVtLmh0bWwiIEFERF9EQVRF +PSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQy +NjQ2ODc2Ij5XZWxjb21lIHRvIHRoZSBIYXBweSBCdWZmYWxvIFNsYW5kZXIgQ29ybmVyISEhPC9B +Pg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3Lnd4cGVyaWVuY2Uud2ViLXVubGltaXRlZC5k +ZS9waHBCQi9pbmRleC5waHAiIEFERF9EQVRFPSIxMDQyNjQ2ODc2IiBMQVNUX1ZJU0lUPSIxMDQ4 +MTc0NjQ1IiBMQVNUX01PRElGSUVEPSIxMDQyNjQ2ODc2Ij5XeHBlcmllbmNlIEZvcnVtcyAtIEZv +cnVtIEluZGV4PC9BPg0KICAgIDxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnJnYWdub24uY29tL21h +c3RlcnMvanMtbGFuZ3VhZ2UuaHRtbCIgQUREX0RBVEU9IjEwNDI2NDY4NzYiIExBU1RfVklTSVQ9 +IjEwNDgxNzQ2NDUiIExBU1RfTU9ESUZJRUQ9IjEwNDI2NDY4NzYiPltSZWFsJ3MgSkFWQSBKQVZB +U0NSSVBUIFBCIGFuZCBXU0ggSG93LXRvXTwvQT4NCjwvREw+PHA+DQpWmgIQgAEADQAAAGJvb2tt +YXJrLmh0bQDNBAIFkAYAmAEAABIAAAADACAOjk8BAB4AATABAAAADQAAAGJvb2ttYXJrLmh0bQAA +AAACAQI3AQAAAAAAAAAeAAM3AQAAAAUAAAAuaHRtAAAAAAMABTcBAAAAHgAHNwEAAAANAAAAYm9v +a21hcmsuaHRtAAAAAAMACzdzAAAAAwAUNwAAAAADAPp/AAAAAEAA+38AQN2jV0WzDEAA/H8AQN2j +V0WzDAMA/X8AAAAACwD+fwAAAAADACEORckDAAIB+A8BAAAAEAAAAM/yM912IydOt4pJEsJHoOQC +AfoPAQAAABAAAADP8jPddiMnTreKSRLCR6DkAgH7DwEAAACWAAAAAAAAADihuxAF5RAaobsIACsq +VsIAAG1zcHN0LmRsbAAAAAAATklUQfm/uAEAqgA32W4AAABDOlxEb2N1bWVudHMgYW5kIFNldHRp +bmdzXGpnZXJsYW5kXExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcTWljcm9zb2Z0XE91 +dGxvb2tcT3V0bG9vay5wc3QAAAADAP4PBwAAAHpn + +--=-2UbcDuksJBAwUNBNW7UD-- + diff --git a/examples/eml/tnef2.eml b/examples/eml/tnef2.eml new file mode 100644 index 000000000..ecf71d444 --- /dev/null +++ b/examples/eml/tnef2.eml @@ -0,0 +1,101 @@ +From: Alice +To: Bob +Subject: TNEF test 2 +Date: Thu, 10 Feb 2022 12:19:57 +0100 +Message-ID: <001d01d81e70$23211250$696336f0$@example.net> +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_NextPart_000_001E_01D81E78.84E7EB50" +X-Mailer: Microsoft Outlook 16.0 +Content-Language: cs +X-MS-TNEF-Correlator: 0000000045EA84AB25A1494B8CD618FC27E0940E04CA7500 +Authentication-Results: example.net; + dkim=pass header.d=example.net header.s=mail header.b=UH8A3Z8P; + dmarc=pass (policy=reject) header.from=example.net; + spf=pass () smtp.mailfrom=example@example.net + +This is a multipart message in MIME format. + +------=_NextPart_000_001E_01D81E78.84E7EB50 +Content-Type: text/plain; + charset="iso-8859-2" +Content-Transfer-Encoding: quoted-printable + +Dobr=FD den, + +=20 + +pos=EDl=E1m zku=B9ebn=ED e-mail: + +=20 + +P=F8=EDli=B9 =BElu=BBou=E8k=FD k=F9=F2 =FAp=ECl =EF=E1belsk=E9 =F3dy + +=20 + +S pozdravem + +=20 + +Mgr. Milo=B9 Bart=E1k + + +------=_NextPart_000_001E_01D81E78.84E7EB50 +Content-Type: application/ms-tnef; + name="winmail.dat" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; + filename="winmail.dat" + +eJ8+IjoLAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA4gQAAAAAAADmAAEIgAcAGAAAAElQTS5NaWNy +b3NvZnQgTWFpbC5Ob3RlADEIAQOQBgCMCgAAJwAAAAsAAgABAAAAAwAmAAAAAAALACkAAAAAAB4A +cAABAAAAHAAAAFprb3Waa2EgZS1tYWlsdSBiZXogcPjtbG9oeQACAXEAAQAAABYAAAAB2B5wHowu +HckFefFLTYHQP0bV2A3UAAALAAEOAAAAAAIBCg4BAAAAGAAAAAAAAABF6oSrJaFJS4zWGPwn4JQO +woAAAAMAFA4BAAAAHgAoDgEAAAAvAAAAMDAwMDAwMDMBYmFydGFrQGVzcC1tYWlsLmN6AWJhcnRh +a0Blc3AtbWFpbC5jegAAHgApDgEAAAAvAAAAMDAwMDAwMDMBYmFydGFrQGVzcC1tYWlsLmN6AWJh +cnRha0Blc3AtbWFpbC5jegAAAwDeP7BvAAADAPE/BQQAAAMAAlkAABYAAwAJWQIAAAALABCACCAG +AAAAAADAAAAAAAAARgAAAAADhQAAAAAAAAMAEoAIIAYAAAAAAMAAAAAAAABGAAAAABCFAAAAAAAA +AwBzgAggBgAAAAAAwAAAAAAAAEYAAAAAAYUAAAAAAAALAKmACCAGAAAAAADAAAAAAAAARgAAAAAG +hQAAAAAAAAsArYAIIAYAAAAAAMAAAAAAAABGAAAAAA6FAAAAAAAAAwCwgAggBgAAAAAAwAAAAAAA +AEYAAAAAGIUAAAAAAAALAMaACCAGAAAAAADAAAAAAAAARgAAAACChQAAAAAAAAMAAIEIIAYAAAAA +AMAAAAAAAABGAAAAAOuFAAAFBAAAAgELggggBgAAAAAAwAAAAAAAAEYBAAAANgAAAEkAbgBUAHIA +YQBuAHMAaQB0AE0AZQBzAHMAYQBnAGUAQwBvAHIAcgBlAGwAYQB0AG8AcgAAAAAAAQAAABAAAAAW +G8UG6IOCQIQ5QUZYFGJYHgAxggggBgAAAAAAwAAAAAAAAEYBAAAAGAAAAEMAbwBtAHAAbwBzAGUA +VAB5AHAAZQAAAAEAAAAIAAAAbmV3TWFpbAALAB8OAQAAAAIB+A8BAAAAEAAAAEXqhKsloUlLjNYY +/CfglA4CAfoPAQAAABAAAABF6oSrJaFJS4zWGPwn4JQOAwD+DwUAAAACAQkQAQAAAFYGAABSBgAA +YREAAExaRnVvWyMSAwAKAHJjcGcxMjWDAtEDYWh0bWwxAzH4YmlkBAADMAEDAfcKgCcCpAPjAgBj +aArAc2XgdDIzOCAHEwKAEIPfAFAEVghVB7ISdTIC4xFYtwYABsMSdTMERhFXMBN8VxKDCO8J9zsZ +YjUJtDliOQojMTkzEnIMYGNnAFALCQFkMzYXoAulNHIgEIIqXA6yAZAOEDlkIDwOsiB4DtAAgDpI +dj0iCHBuOgTwaGJlAMBzLW0N4ANgc2pvAYAtBaBtIAAO0CJdH6VvIC8hOSFgZg3gZXskVSIWdyKv +I78loAWwZA0iFm0lwA6wdHA6L6ovJiUuIQcuIaEvJGRiLwHQMDQvDiAqoG0LIfcox3cs4C53My4B +BbBnL1RSL1JFhEMtDrI0MCI+EoONHpczHjAfUGVhZC59NDE2DvA8B4ABkCBuMmEHgD1HCfAEkGF0 +rwWxBaACMAnwdCXATSEWBCBXKAEgMTUgKG8kgB7gBJAJgCAHgA9QdRxtKS5uHiAw8XN0eYxsZTU/ +MPEhLS0Ko5AvKiBGAiEgRAEQMQuAaXRpAiAEICovpQqjQAISLWYA0GUKpBsBkQMwezpFIQBseTp0 +IkMxgGIHIQXQMhBoLiIagDrnCrBuIUBlLdwxOhWQHjAz8DM+oR4w7jY+wT5xGoB9Oe86/zwD+Txg +bGk8kT0/PkMz4TPw3xWQRGIeMD9bOIFTNoI4/9EKwXAuTSFQTgWwAMC4bCwgQmBHig9QdkeID0DK +AMAtYAuAOjBjbRdCuUAzAJB6JLAxMS4eMAUwS1476EJjIixz7wBxTEAGckK5bSFQQHEZcMcmcCGA +C2BuZ3UfACSwoEVOLVVTP6ZzPeE6LkXiRSDwC3AZAHZawHBydnkxN0n7UHH1NnMtNoBwJLBVgBGg +AiD7B0AhknA+EU0PTh9PL0ExRxjjJaALgGRvdzKQeEdM8T/ER4JDaHBGQWF+dR7gVA9VGFrgVnAA +IC3/AiA8IFa/V89Y31A/UU8/8u8KsFGAM4MGYGM5YhxTQQaLTFMw4DJMwiA3OWajg2GKSsQ3MC44 +NWbSf2ivaTM/pkkiZL9BFWRiOv9rSj+mOBA2zx8xKUA2jzeYMlsGkCBnMpBiIiA5KF0+PB+xPgqj +PG+/JhARgFWAAQFcMgQgdl4RezLBNMF0IhBSgA9AAMB4oSXAMTAyNiIQL3K1Ni9ygjfwWwnwD1Bm +Xd9uX3EPch9zJQtgeQhgBUBXdCpyt3UScHQcZDIQYX91YXXJent5sHZvLow2Mi+fL68fAA5AH0AG +4GR5SDCZYwE9QwXwQmBuayXAQCMwNTYzQ34xduGEZTk1NEYBwHTRb9LkPScn8i13MgApEDyQ7YIw +a4cAKAEnLnAeowAhfwMwYvJ1gR8wiDYXoB5bOb0/MDxJITJQC2AEED1rSu+IGQAAiX8e0zYvcXzg +i1QnR5eMf42DRG88kFwndwVwSRAJ8Cx3jS9xcyBw/XduNRWQftKTYYg2CqKIJ/8KcohHCrGWeInt +AcBvkZNuX46vj7+Xn5KvHnk4HjAmnG5iUoACgIg4J2EBQP+cb5QflS+WP5dPmF+Zb5p/f5uPpXRW +cZGQCYAZUKrgMRBtIHprDHAnOWFsZWILkKrhID4wUzI6/5z/ng+h/6MPpB+lL6Y/p0//qF+pb6Ef +rc+e75//t3+vL3+wP7FPu3+zb7R/tY+2nyB6UJGROKrTAKCrwbsROY960KuiWqCroWU4a5GT/8di +G1CRoBWQkZFzYKrRi1BXuxEBEKsiYnrQc8dhZfuJQZGgM4Owt7+4z7y/vc//vt+/78D/wg/DH8Qv +u9/Lf/+5r7q/1S/M383vzv/ZL9Efn9Iv0z/UTwYAqpF6ZDIA/nYmUNVv1n/ab9t/3I/dn//er9+/ +4M/h39mP5K/XX9hv/+5f5g/nH+gv8l/qT+tf7G//7X8eTPDRg4D66ztR+78e1L40EgA2YD3hhkZM +CTRMw41aFCOJMC9gN0Q7Yj+vY0KEMIgK+5lNCcAuPNC7U1HGE0IKwFxgqzFrHlz/hOBvkj3hiBn1 +KIn989L9WvcJP/9fAG83AZ8CrwO/+2//7s/lD/PIBx8ILwvJ9G/1f//2j/efL+4rQG+RSSEXfxuf +34NADWEK8IOhd243gfIuEQUucH0jAAAAAwAWEAAAAAADAA00/T+lDgMADzT9P6UOAgEUNAEAAAAQ +AAAATklUQfm/uAEAqgA32W4AAAIBfwABAAAAMQAAADAwMDAwMDAwNDVFQTg0QUIyNUExNDk0QjhD +RDYxOEZDMjdFMDk0MEUwNENBNzUwMAAAAAADAAYQuPK1DAMABxBYAAAAAwAQEAAAAAADABEQAAAA +AB4ACBABAAAAWQAAAERPQlL9REVOLFBPU+1M4U1aS1W5RUJO7UUtTUFJTDpQ+O1MSbm+TFW7T1Xo +S/1L+fL6UOxM7+FCRUxTS+nzRFlTUE9aRFJBVkVNTUdSTUlMT7lCQVJU4UsAAAAAvTM= + +------=_NextPart_000_001E_01D81E78.84E7EB50-- + diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/BodyStructure.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/BodyStructure.php index b7e72b890..16f7975af 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/BodyStructure.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/BodyStructure.php @@ -209,6 +209,7 @@ class BodyStructure implements \JsonSerializable /** * No text found, is it encrypted? * If so, just return that. + * Only when \RainLoop\Api::Config()->Get('security', 'openpgp', true) */ if (!$aParts) { $gEncryptedParts = $this->SearchByContentType('multipart/encrypted'); diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index f95d586e6..abc627173 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -148,18 +148,6 @@ class MailClient } $aFetchItems[] = $sLine; } -/* - $gSignatureParts = $oBodyStructure->SearchByContentType('multipart/signed'); - foreach ($gSignatureParts as $oPart) { - if ($oPart->isPgpSigned()) { - // An empty section specification refers to the entire message, including the header. - // But Dovecot does not return it with BODY.PEEK[1], so we also use BODY.PEEK[1.MIME]. - $aFetchItems[] = FetchType::BODY_PEEK.'['.$oPart->SubParts()[0]->PartID().'.MIME]'; - $aFetchItems[] = FetchType::BODY_PEEK.'['.$oPart->SubParts()[0]->PartID().']'; - $aFetchItems[] = FetchType::BODY_PEEK.'['.$oPart->SubParts()[1]->PartID().']'; - } - } -*/ } } @@ -500,11 +488,11 @@ class MailClient $aFetchIterator = $this->oImapClient->FetchIterate($aFetchItems, (string) $oRange, $oRange->UID); // FETCH does not respond in the id order of the SequenceSet, so we prefill $aCollection for the right sort order. $aCollection = \array_fill_keys($oRange->getArrayCopy(), null); - foreach ($aFetchIterator as $oFetchResponseItem) { + foreach ($aFetchIterator as $oFetchResponse) { $id = $oRange->UID - ? $oFetchResponseItem->GetFetchValue(FetchType::UID) - : $oFetchResponseItem->oImapResponse->ResponseList[1]; - $oMessage = Message::fromFetchResponse($oMessageCollection->FolderName, $oFetchResponseItem); + ? $oFetchResponse->GetFetchValue(FetchType::UID) + : $oFetchResponse->oImapResponse->ResponseList[1]; + $oMessage = Message::fromFetchResponse($oMessageCollection->FolderName, $oFetchResponse); if ($oMessage) { if ($aAllThreads) { $iUid = $oMessage->Uid; diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Message.php b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Message.php index c64d660f6..ed848213a 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Message.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Message.php @@ -112,6 +112,16 @@ class Message implements \JsonSerializable return $this->Attachments; } + public function setPlain(string $value) : void + { + $this->sPlain = $value; + } + + public function setHtml(string $value) : void + { + $this->sHtml = $value; + } + private function setSpamScore($value) : void { $this->SpamScore = \intval(\max(0, \min(100, $value))); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php index 2a120bf5f..a258cc97e 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php @@ -515,6 +515,29 @@ trait Messages } catch (\Throwable $e) { $this->logException($e); } +/* + if (!$oMessage->sPlain && !$oMessage->sHtml && !$oMessage->pgpEncrypted && !$oMessage->smimeEncrypted) { + $aAttachments = $oMessage->Attachments ?: []; + foreach ($aAttachments as $oAttachment) { +// \in_array($oAttachment->ContentType(), ['application/vnd.ms-tnef', 'application/ms-tnef']) + if ('winmail.dat' === \strtolower($oAttachment->FileName())) { + $sData = $this->ImapClient()->FetchMessagePart( + $oMessage->Uid, + $oAttachment->PartID() + ); + $oTNEF = new \TNEFDecoder\TNEFAttachment; + $oTNEF->decodeTnef($sData); + foreach ($oTNEF->getFiles() as $oFile) { + if (\in_array($oFile->type, ['application/rtf', 'text/rtf'])) { + $rtf = new \SnappyMail\Rtf\Document($oFile->content); + $oMessage->setHtml($rtf->toHTML()); + } + } + break; + } + } + } +*/ } catch (\Throwable $oException) { diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/LICENSE b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/LICENSE new file mode 100644 index 000000000..d159169d1 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFAttachment.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFAttachment.php new file mode 100644 index 000000000..9032c6def --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFAttachment.php @@ -0,0 +1,372 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ + + +class TNEFAttachment +{ + + var $validateChecksum; + var $mailinfo; + var $files; + var $files_nested; + var $attachments; + var $current_receiver; + var $body; + + function __construct($validateChecksum = false) + { + $this->validateChecksum = $validateChecksum; + $this->files = array(); + $this->attachments = array(); + $this->mailinfo = new TNEFMailinfo(); + $this->body = []; + } + + /** + * @return TNEFFileBase[] + */ + function &getFiles() + { + return $this->files; + } + + /** + * @return TNEFFileBase[] + */ + function &getFilesNested() + { + if (!$this->files_nested) + { + $this->files_nested = array(); + + $num_attach = count($this->attachments); + if ($num_attach > 0) + { + for ($cnt = 0; $cnt < $num_attach; $cnt++) + { + $this->addFiles($this->files_nested, $this->files); + $this->addFiles($this->files_nested, $this->attachments[$cnt]->getFilesNested()); + } + } + else + $this->addFiles($this->files_nested, $this->files); + } + + return $this->files_nested; + } + + function addFiles(&$add_to, &$add) + { + global $tnef_minimum_rtf_size_to_decode; + $num_files = count($add); + for ($cnt = 0; $cnt < $num_files; $cnt++) + if ((strtolower(get_class($add[$cnt])) != "tneffilertf") || ($add[$cnt]->getSize() > $tnef_minimum_rtf_size_to_decode)) + $add_to[] = &$add[$cnt]; + } + + function addFilesCond(&$add_to, &$add) + { + global $tnef_minimum_rtf_size_to_decode; + $num_files = count($add); + for ($cnt = 0; $cnt < $num_files; $cnt++) + if ((strtolower(get_class($add[$cnt])) == "tneffilertf") && ($add[$cnt]->getSize() > $tnef_minimum_rtf_size_to_decode)) + $add_to[] = &$add[$cnt]; + } + + function getAttachments() + { + return $this->attachments; + } + + /** + * @return TNEFMailinfo + */ + function getMailinfo() + { + return $this->mailinfo; + } + + function getBodyElements() + { + return $this->body; + } + + function decodeTnef($data) + { + $buffer = new TNEFBuffer($data); + + $tnef_signature = tnef_geti32($buffer); + if ($tnef_signature == TNEF_SIGNATURE) { + $tnef_key = tnef_geti16($buffer); + tnef_log(sprintf("Signature: 0x%08x\nKey: 0x%04x\n", $tnef_signature, $tnef_key)); + + while ($buffer->getRemainingBytes() > 0) { + $lvl_type = tnef_geti8($buffer); + + switch ($lvl_type) { + case TNEF_LVL_MESSAGE: + $this->tnef_decode_attribute($buffer); + break; + + case TNEF_LVL_ATTACHMENT: + $this->tnef_decode_attribute($buffer); + break; + + default: + $len = $buffer->getRemainingBytes(); + if ($len > 0) + tnef_log("Invalid file format! Unknown Level $lvl_type. Rest=$len"); + } + break; + } + } + else + { + tnef_log("Invalid file format! Wrong signature."); + } + + // propagate parent message's code page to child files if given + // + $code_page = $this->mailinfo->getCodePage(); + if (!empty($code_page)) + foreach ($this->files as $i => $file) + $this->files[$i]->setMessageCodePage($code_page); + } + + function tnef_decode_attribute(TNEFBuffer $buffer) + { + $attribute = tnef_geti32($buffer); // attribute if + $length = tnef_geti32($buffer); // length + $value = tnef_getx($length, $buffer); // data + $checksumAtt = tnef_geti16($buffer); // checksum + if ($value !== null && $this->validateChecksum) { + $checksum = array_sum(unpack('C*', $value)) & 0xFFFF; + if ($checksum !== $checksumAtt) { + throw new \Exception('Checksums do not match'); + } + } + + switch($attribute) + { + case TNEF_ARENDDATA: // marks start of new attachment + tnef_log("Creating new File for Attachment"); + $this->current_receiver = new TNEFFile(); + $this->files[] = $this->current_receiver; + break; + + case TNEF_AMAPIATTRS: + tnef_log("mapi attrs"); + $this->extract_mapi_attrs(new TNEFBuffer($value)); + break; + + case TNEF_AMAPIPROPS: + tnef_log("mapi props"); + $this->extract_mapi_attrs(new TNEFBuffer($value)); + break; + + case TNEF_AMCLASS: + $value = substr($value, 0, $length - 1); + if ($value == 'IPM.Contact') + { + tnef_log("Creating vCard Attachment"); + $this->current_receiver = new TNEFvCard(); + $this->files[] = $this->current_receiver; + } + break; + + default: + $this->mailinfo->receiveTnefAttribute($attribute, $value, $length); + if ($this->current_receiver) + $this->current_receiver->receiveTnefAttribute($attribute, $value, $length); + break; + } + } + + function extract_mapi_attrs(TNEFBuffer $buffer) + { + + $number = tnef_geti32($buffer); // number of attributes + $props = 0; + $ended = 0; + + while (($buffer->getRemainingBytes() > 0) && ($props < $number) && (!$ended)) + { + $props++; + $value = ''; + unset($named_id); + $length = 0; + $have_multivalue = 0; + $num_multivalues = 1; + $attr_type = tnef_geti16($buffer); + $attr_name = tnef_geti16($buffer); + + if (($attr_type & TNEF_MAPI_MV_FLAG) != 0) + { + tnef_log("Multivalue Attribute found."); + $have_multivalue = 1; + $attr_type = $attr_type & ~TNEF_MAPI_MV_FLAG; + } + + if (($attr_name >= 0x8000) && ($attr_name < 0xFFFE)) // Named Attribute + { + $guid = tnef_getx(16, $buffer); + $named_type = tnef_geti32($buffer); + switch ($named_type) + { + case TNEF_MAPI_NAMED_TYPE_ID: + $named_id = tnef_geti32($buffer); + $attr_name = $named_id; + tnef_log(sprintf("Named Id='0x%04x'", $named_id)); + break; + + case TNEF_MAPI_NAMED_TYPE_STRING: + $attr_name = 0x9999; // dummy to identify strings + $idlen = tnef_geti32($buffer); + tnef_log("idlen=$idlen"); + $buflen = $idlen + ((4 - ($idlen % 4)) % 4); // pad to next 4 byte boundary + tnef_log("buflen=$buflen"); + $named_id = substr(tnef_getx($buflen, $buffer), 0, $idlen ); // read and truncate to length + tnef_log("Named Id='$named_id'"); + break; + + default: + tnef_log(sprintf("Unknown Named Type 0x%04x found", $named_type)); + break; + } + } + + if ($have_multivalue) + { + $num_multivalues = tnef_geti32($buffer); + tnef_log("Number of multivalues=$num_multivalues"); + } + + switch($attr_type) + { + case TNEF_MAPI_NULL: + break; + + case TNEF_MAPI_SHORT: + $value = tnef_geti16($buffer); + break; + + case TNEF_MAPI_INT: + case TNEF_MAPI_BOOLEAN: + for ($cnt = 0; $cnt < $num_multivalues; $cnt++) + $value = tnef_geti32($buffer); + break; + + case TNEF_MAPI_FLOAT: + case TNEF_MAPI_ERROR: + $value = tnef_getx(4, $buffer); + break; + + case TNEF_MAPI_DOUBLE: + case TNEF_MAPI_APPTIME: + case TNEF_MAPI_CURRENCY: + case TNEF_MAPI_INT8BYTE: + case TNEF_MAPI_SYSTIME: + $value = tnef_getx(8, $buffer); + break; + + case TNEF_MAPI_CLSID: + tnef_log("What is a MAPI CLSID ????"); + break; + + case TNEF_MAPI_STRING: + case TNEF_MAPI_UNICODE_STRING: + case TNEF_MAPI_BINARY: + case TNEF_MAPI_OBJECT: + if ($have_multivalue) + $num_vals = $num_multivalues; + else + $num_vals = tnef_geti32($buffer); + + if ($num_vals > 20) // A Sanity check. + { + $ended = 1; + tnef_log("Number of entries in String Attributes=$num_vals. Aborting Mapi parsing."); + } + else + { + for ($cnt = 0; $cnt < $num_vals; $cnt++) + { + $length = tnef_geti32($buffer); + $buflen = $length + ((4 - ($length % 4)) % 4); // pad to next 4 byte boundary + if ($attr_type == TNEF_MAPI_STRING) + $length -= 1; + $value = substr(tnef_getx($buflen, $buffer), 0, $length); // read and truncate to length + } + } + break; + + default: + tnef_log("Unknown mapi attribute! $attr_type"); + break; + } + + switch ($attr_name) + { + case TNEF_MAPI_ATTACH_DATA: + tnef_log("MAPI Found nested attachment. Processing new one."); + $value = substr($value, 16); // skip the next 16 bytes (unknown data) + $att = new TNEFAttachment($this->validateChecksum); + $att->decodeTnef($value); + $this->attachments[] = $att; + tnef_log("MAPI Finished nested attachment. Continuing old one."); + break; + + case TNEF_MAPI_RTF_COMPRESSED: + tnef_log("MAPI Found Compressed RTF Attachment."); + $this->files[] = new TNEFFileRTF($value); + break; + case TNEF_MAPI_BODY: + case TNEF_MAPI_BODY_HTML: + $result = []; + $result['type'] = 'text'; + $result['subtype'] = $attr_name == TNEF_MAPI_BODY ? 'plain' : 'html'; + $result['name'] = ('Untitled') . ($attr_name == TNEF_MAPI_BODY ? '.txt' : '.html'); + $result['stream'] = $value; + $result['size'] = strlen($value); + $this->body[] = $result; + break; + default: + $this->mailinfo->receiveMapiAttribute($attr_type, $attr_name, $value, $length, ($attr_type == TNEF_MAPI_UNICODE_STRING)); + if ($this->current_receiver) + $this->current_receiver->receiveMapiAttribute($attr_type, $attr_name, $value, $length, ($attr_type == TNEF_MAPI_UNICODE_STRING)); + break; + } + } + if ($ended) + { + $len = $buffer->getRemainingBytes(); + for ($cnt = 0; $cnt < $len; $cnt++) + { + $ord = tnef_geti8($buffer); + if ($ord == 0) + $char = ""; + else + $char = chr($ord); + tnef_log(sprintf("Char Nr. %6d = 0x%02x = '%s'", $cnt, $ord, $char)); + } + } + } +} diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFBuffer.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFBuffer.php new file mode 100644 index 000000000..a725c508a --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFBuffer.php @@ -0,0 +1,48 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ + +class TNEFBuffer +{ + private string $data; + private int $offset; + + function __construct(string $data) + { + $this->data = $data; + $this->offset = 0; + } + + function getBytes(int $numBytes): ?string + { + if ($this->getRemainingBytes() < $numBytes) { + $this->offset = \strlen($this->data); + return null; + } + + $this->offset += $numBytes; + return \substr($this->data, $this->offset - $numBytes, $numBytes); + } + + function getRemainingBytes(): int + { + return \strlen($this->data) - $this->offset; + } +} + + + diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFDate.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFDate.php new file mode 100644 index 000000000..e49b22362 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFDate.php @@ -0,0 +1,44 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ + +class TNEFDate +{ + + private ?int $year; + private ?int $month; + private ?int $day; + private ?int $hour; + private ?int $minute; + private ?int $second; + + public function setTnefBuffer(TNEFBuffer $buffer) + { + $this->year = tnef_geti16($buffer); + $this->month = tnef_geti16($buffer); + $this->day = tnef_geti16($buffer); + $this->hour = tnef_geti16($buffer); + $this->minute = tnef_geti16($buffer); + $this->second = tnef_geti16($buffer); + } + + public function __toString(): string + { + return \sprintf("%04d-%02d-%02d %02d:%02d:%02d", + $this->year, $this->month, $this->day, + $this->hour, $this->minute, $this->second); + } + +} diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFile.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFile.php new file mode 100644 index 000000000..4ed914b50 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFile.php @@ -0,0 +1,118 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ + +class TNEFFile extends TNEFFileBase +{ + + var $metafile; + + function getMetafile() + { + return $this->metafile; + } + + function receiveTnefAttribute($attribute, $value, $length) + { + switch ($attribute) + { + + // filename + // + case TNEF_AFILENAME: + // strip path + // + if (($pos = strrpos($value, '/')) !== FALSE) + $this->name = substr($value, $pos + 1); + else + $this->name = $value; + + // Strip trailing null bytes if present + $this->name = trim($this->name); + break; + // code page + // + case TNEF_AOEMCODEPAGE: + $this->code_page = tnef_geti16(new TNEFBuffer($value)); + break; + + // the attachment itself + // + case TNEF_ATTACHDATA: + $this->content = $value; + break; + + // a metafile + // + case TNEF_ATTACHMETAFILE: + $this->metafile = $value; + break; + + case TNEF_AATTACHCREATEDATE: + $this->created = new TNEFDate(); + $this->created->setTnefBuffer(new TNEFBuffer($value)); + + case TNEF_AATTACHMODDATE: + $this->modified = new TNEFDate(); + $this->modified->setTnefBuffer(new TNEFBuffer($value)); + break; + } + } + + function receiveMapiAttribute($attr_type, $attr_name, $value, $length, $is_unicode=FALSE) + { + switch ($attr_name) + { + + // used in preference to AFILENAME value + // + case TNEF_MAPI_ATTACH_LONG_FILENAME: + // strip path + // + if (($pos = strrpos($value, '/')) !== FALSE) + $this->name = substr($value, $pos + 1); + else + $this->name = $value; + + if ($is_unicode) $this->name_is_unicode = TRUE; + break; + + // Is this ever set, and what is format? + // + case TNEF_MAPI_ATTACH_MIME_TAG: + $type0 = $type1 = ''; + $mime_type = explode('/', $value, 2); + if (!empty($mime_type[0])) + $type0 = $mime_type[0]; + if (!empty($mime_type[1])) + $type1 = $mime_type[1]; + $this->type = "$type0/$type1"; + if ($is_unicode) { + $this->type = substr(mb_convert_encoding($this->type, "UTF-8" , "UTF-16LE"), 0, -1); + } + break; + + case TNEF_MAPI_ATTACH_EXTENSION: + $type = \SnappyMail\File\MimeType::fromFilename($value); + if ($type) + $this->type = $type; + break; + } + } + +} + + + diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFileBase.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFileBase.php new file mode 100644 index 000000000..ecc4b8688 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFileBase.php @@ -0,0 +1,52 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ + +class TNEFFileBase +{ + public bool $name_is_unicode = FALSE; + public string $name = 'Untitled'; + public string $code_page = ''; + public string $message_code_page = ''; // parent message's code page (the whole TNEF file) + public string $type = 'application/octet-stream'; + public string $content = ''; + var $created; + var $modified; + + function setMessageCodePage(string $code_page) + { + $this->message_code_page = $code_page; + } + + function getCodePage() + { + return empty($this->code_page) + ? $this->message_code_page + : $this->code_page; + } + + function getName() + { + if ($this->name_is_unicode) { + return \substr(\mb_convert_encoding($this->name, "UTF-8" , "UTF-16LE"), 0, -1); + } + return $this->name; + } + + function getSize() + { + return \strlen($this->content); + } +} diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFileRTF.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFileRTF.php new file mode 100644 index 000000000..ceb6f014e --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFFileRTF.php @@ -0,0 +1,111 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ +class TNEFFileRTF extends TNEFFileBase +{ + var $size; + const MAX_DICT_SIZE = 4096; + const INIT_DICT_SIZE = 207; + + function __construct($data) + { + parent::__construct(); + $this->type = "application/rtf"; + $this->name = "EmbeddedRTF.rtf"; + + $this->decode_crtf(new TNEFBuffer($data)); + } + + function getSize() + { + return $this->size; + } + + function decode_crtf(TNEFBuffer $buffer) + { + $size_compressed = tnef_geti32($buffer); + $this->size = tnef_geti32($buffer); + $magic = tnef_geti32($buffer); + $crc32 = tnef_geti32($buffer); + + tnef_log("CRTF: size comp=$size_compressed, size=$this->size"); + + $data = tnef_getx($buffer->getRemainingBytes(), $buffer); + + switch ($magic) { + case CRTF_COMPRESSED: + $this->uncompress($data); + break; + + case CRTF_UNCOMPRESSED: + $this->content = $data; + break; + + default: + tnef_log("Unknown Compressed RTF Format"); + break; + } + } + + function uncompress($data) + { + $preload = "{\\rtf1\\ansi\\mac\\deff0\\deftab720{\\fonttbl;}{\\f0\\fnil \\froman \\fswiss \\fmodern \\fscript \\fdecor MS Sans SerifSymbolArialTimes New RomanCourier{\\colortbl\\red0\\green0\\blue0\n\r\\par \\pard\\plain\\f0\\fs20\\b\\i\\u\\tab\\tx"; + $length_preload = strlen($preload); + $init_dict = []; + for ($cnt = 0; $cnt < $length_preload; $cnt++) { + $init_dict[$cnt] = $preload[$cnt]; + } + $init_dict = array_merge($init_dict, array_fill(count($init_dict), self::MAX_DICT_SIZE - $length_preload, ' ')); + $write_offset = self::INIT_DICT_SIZE; + $this->content = ''; + $end = false; + $in = 0; + $l = strlen($data); + while (!$end) { + if ($in >= $l) { + break; + } + $control = strrev(str_pad(decbin(ord($data[$in++])), 8, 0, STR_PAD_LEFT)); + for ($i = 0; $i < 8; $i++) { + if ($control[$i] == '1') { + $token = unpack("n", $data[$in++] . $data[$in++])[1]; + $offset = ($token >> 4) & 0b111111111111; + $length = $token & 0b1111; + if ($write_offset == $offset) { + $end = true; + break; + } + $actual_length = $length + 2; + for ($step = 0; $step < $actual_length; $step++) { + $read_offset = ($offset + $step) % self::MAX_DICT_SIZE; + $char = $init_dict[$read_offset]; + $this->content .= $char; + $init_dict[$write_offset] = $char; + $write_offset = ($write_offset + 1) % self::MAX_DICT_SIZE; + } + } else { + if ($in >= $l) { + break; + } + $val = $data[$in++]; + $this->content .= $val; + $init_dict[$write_offset] = $val; + $write_offset = ($write_offset + 1) % self::MAX_DICT_SIZE; + } + } + } + } + +} diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFMailinfo.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFMailinfo.php new file mode 100644 index 000000000..d266e699b --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFMailinfo.php @@ -0,0 +1,109 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ + +class TNEFMailinfo +{ + + var $subject; + var $topic; + var $topic_is_unicode = FALSE; + var $from; + var $from_is_unicode = FALSE; + var $from_name; + var $from_name_is_unicode = FALSE; + var $date_sent; + var $code_page = ''; + + + function getTopic() + { + return $this->topic; + } + + function getSubject() + { + return $this->subject; + } + + function getFrom() + { + return $this->from; + } + + function getCodePage() + { + return $this->code_page; + } + + function getFromName() + { + return $this->from_name; + } + + function getDateSent() + { + return $this->date_sent; + } + + function receiveTnefAttribute($attribute, $value, $length) + { + $value = new TNEFBuffer($value); + + switch($attribute) + { + case TNEF_AOEMCODEPAGE: + $this->code_page = tnef_geti16($value); + break; + + case TNEF_ASUBJECT: + $this->subject = tnef_getx($length - 1, $value); + break; + + case TNEF_ADATERECEIVED: + if (!$this->date_sent) + { + $this->date_sent = new TNEFDate(); + $this->date_sent->setTnefBuffer($value); + } + break; + case TNEF_ADATESENT: + $this->date_sent = new TNEFDate(); + $this->date_sent->setTnefBuffer($value); + } + } + + function receiveMapiAttribute($attr_type, $attr_name, $value, $length, $is_unicode=FALSE) + { + switch($attr_name) + { + case TNEF_MAPI_CONVERSATION_TOPIC: + $this->topic = $value; + if ($is_unicode) $this->topic_is_unicode = TRUE; + break; + + case TNEF_MAPI_SENT_REP_EMAIL_ADDR: + $this->from = $value; + if ($is_unicode) $this->from_is_unicode = TRUE; + break; + + case TNEF_MAPI_SENT_REP_NAME: + $this->from_name = $value; + if ($is_unicode) $this->from_name_is_unicode = TRUE; + break; + } + } + +} diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFvCard.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFvCard.php new file mode 100644 index 000000000..b705d4bec --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/TNEFvCard.php @@ -0,0 +1,302 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ + +class TNEFvCard extends TNEFFileBase +{ + + public bool $name_is_unicode = FALSE; + public string $name = 'Untitled'; + public string $code_page = ''; + public string $message_code_page = ''; // parent message's code page (the whole TNEF file) + public string $type = 'text/x-vcard'; + public string $content = ''; + var $metafile; + var $surname; + var $surname_is_unicode = FALSE; + var $given_name; + var $given_name_is_unicode = FALSE; + var $middle_name; + var $middle_name_is_unicode = FALSE; + var $nickname; + var $nickname_is_unicode = FALSE; + var $company; + var $company_is_unicode = FALSE; + var $homepages; + var $addresses; + var $emails; + var $telefones; + + private static + $address_mapping = array ( + TNEF_MAPI_LOCALTY => array ("Address", ADDRESS_CITY), + TNEF_MAPI_COUNTRY => array ("Address", ADDRESS_COUNTRY), + TNEF_MAPI_POSTAL_CODE => array ("Address", ADDRESS_ZIP), + TNEF_MAPI_STATE_OR_PROVINCE => array ("Address", ADDRESS_STATE), + TNEF_MAPI_STREET_ADDRESS => array ("Address", ADDRESS_STREET), + TNEF_MAPI_POST_OFFICE_BOX => array ("Address", ADDRESS_PO_BOX), + TNEF_MAPI_HOME_ADDR_CITY => array ("Home Address", ADDRESS_CITY), + TNEF_MAPI_HOME_ADDR_COUNTRY => array ("Home Address", ADDRESS_COUNTRY), + TNEF_MAPI_HOME_ADDR_ZIP => array ("Home Address", ADDRESS_ZIP), + TNEF_MAPI_HOME_ADDR_STATE => array ("Home Address", ADDRESS_STATE), + TNEF_MAPI_HOME_ADDR_STREET => array ("Home Address", ADDRESS_STREET), + TNEF_MAPI_HOME_ADDR_PO_BOX => array ("Home Address", ADDRESS_PO_BOX), + TNEF_MAPI_OTHER_ADDR_CITY => array ("Other Address", ADDRESS_CITY), + TNEF_MAPI_OTHER_ADDR_COUNTRY => array ("Other Address", ADDRESS_COUNTRY), + TNEF_MAPI_OTHER_ADDR_ZIP => array ("Other Address", ADDRESS_ZIP), + TNEF_MAPI_OTHER_ADDR_STATE => array ("Other Address", ADDRESS_STATE), + TNEF_MAPI_OTHER_ADDR_STREET => array ("Other Address", ADDRESS_STREET), + TNEF_MAPI_OTHER_ADDR_PO_BOX => array ("Other Address", ADDRESS_PO_BOX), + ), + $email_mapping = array ( + TNEF_MAPI_EMAIL1_DISPLAY => array ("Email 1", EMAIL_DISPLAY), + TNEF_MAPI_EMAIL1_TRANSPORT => array ("Email 1", EMAIL_TRANSPORT), + TNEF_MAPI_EMAIL1_EMAIL => array ("Email 1", EMAIL_EMAIL), + TNEF_MAPI_EMAIL1_EMAIL2 => array ("Email 1", EMAIL_EMAIL2), + TNEF_MAPI_EMAIL2_DISPLAY => array ("Email 2", EMAIL_DISPLAY), + TNEF_MAPI_EMAIL2_TRANSPORT => array ("Email 2", EMAIL_TRANSPORT), + TNEF_MAPI_EMAIL2_EMAIL => array ("Email 2", EMAIL_EMAIL), + TNEF_MAPI_EMAIL2_EMAIL2 => array ("Email 2", EMAIL_EMAIL2), + TNEF_MAPI_EMAIL3_DISPLAY => array ("Email 3", EMAIL_DISPLAY), + TNEF_MAPI_EMAIL3_TRANSPORT => array ("Email 3", EMAIL_TRANSPORT), + TNEF_MAPI_EMAIL3_EMAIL => array ("Email 3", EMAIL_EMAIL), + TNEF_MAPI_EMAIL3_EMAIL2 => array ("Email 3", EMAIL_EMAIL2), + ), + $homepage_mapping = array ( + TNEF_MAPI_PERSONAL_HOME_PAGE => "Personal Homepage", + TNEF_MAPI_BUSINESS_HOME_PAGE => "Business Homepage", + TNEF_MAPI_OTHER_HOME_PAGE => "Other Homepage", + ), + $telefone_mapping = array ( + TNEF_MAPI_PRIMARY_TEL_NUMBER => "Primary Telefone", + TNEF_MAPI_HOME_TEL_NUMBER => "Home Telefone", + TNEF_MAPI_HOME2_TEL_NUMBER => "Home2 Telefone", + TNEF_MAPI_BUSINESS_TEL_NUMBER => "Business Telefone", + TNEF_MAPI_BUSINESS2_TEL_NUMBER => "Business2 Telefone", + TNEF_MAPI_MOBILE_TEL_NUMBER => "Mobile Telefone", + TNEF_MAPI_RADIO_TEL_NUMBER => "Radio Telefone", + TNEF_MAPI_CAR_TEL_NUMBER => "Car Telefone", + TNEF_MAPI_OTHER_TEL_NUMBER => "Other Telefone", + TNEF_MAPI_PAGER_TEL_NUMBER => "Pager Telefone", + TNEF_MAPI_PRIMARY_FAX_NUMBER => "Primary Fax", + TNEF_MAPI_BUSINESS_FAX_NUMBER => "Business Fax", + TNEF_MAPI_HOME_FAX_NUMBER => "Home Fax", + ); + + function __construct() + { + $this->telefones = array(); + $this->homepages = array(); + $this->emails = array(); + $this->addresses = array(); + } + + function getSurname() + { + return $this->surname; + } + + function getGivenName() + { + return $this->given_name; + } + + function getMiddleName() + { + return $this->middle_name; + } + + function getNickname() + { + return $this->nickname; + } + + function getCompany() + { + return $this->company; + } + + function getAddresses() + { + return $this->addresses; + } + + function getMetafile() + { + return $this->metafile; + } + + function getTelefones() + { + return $this->telefones; + } + + function getHomepages() + { + return $this->homepages; + } + + function getEmails() + { + return $this->emails; + } + + function receiveTnefAttribute($attribute, $value, $length) + { + switch ($attribute) + { + + // code page + // + case TNEF_AOEMCODEPAGE: + $this->code_page = tnef_geti16(new TNEFBuffer($value)); + break; + + } + } + + function receiveMapiAttribute($attr_type, $attr_name, $value, $length, $is_unicode=FALSE) + { + switch($attr_name) + { + case TNEF_MAPI_DISPLAY_NAME: + $this->name = $value; + + if ($is_unicode) $this->name_is_unicode = TRUE; + + break; + + case TNEF_MAPI_SURNAME: + $this->surname = $value; + + if ($is_unicode) $this->surname_is_unicode = TRUE; + + break; + + case TNEF_MAPI_GIVEN_NAME: + $this->given_name = $value; + + if ($is_unicode) $this->given_name_is_unicode = TRUE; + + break; + + case TNEF_MAPI_MIDDLE_NAME: + $this->middle_name = $value; + + if ($is_unicode) $this->middle_name_is_unicode = TRUE; + + break; + + case TNEF_MAPI_NICKNAME: + $this->nickname = $value; + + if ($is_unicode) $this->nickname_is_unicode = TRUE; + + break; + + case TNEF_MAPI_COMPANY_NAME: + $this->company = $value; + + if ($is_unicode) $this->company_is_unicode = TRUE; + + break; + + default: + $rc = $this->evaluateTelefoneAttribute($attr_type, $attr_name, $value, $length); + if (!$rc) + $rc = $this->evaluateEmailAttribute($attr_type, $attr_name, $value, $length); + if (!$rc) + $rc = $this->evaluateAddressAttribute($attr_type, $attr_name, $value, $length); + if (!$rc) + $rc = $this->evaluateHomepageAttribute($attr_type, $attr_name, $value, $length); + break; + } + } + + function evaluateTelefoneAttribute($attr_type, $attr_name, $value, $length) + { + $rc = 0; + + if ($length > 0) + { + if (array_key_exists($attr_name, static::$telefone_mapping)) + { + $telefone_key = static::$telefone_mapping[$attr_name]; + $this->telefones[$telefone_key] = $value; + $rc = 1; + tnef_log("Setting telefone '$telefone_key' to value '$value'"); + } + } + + return $rc; + } + + function evaluateEmailAttribute($attr_type, $attr_name, $value, $length) + { + $rc = 0; + + if ($length > 0) + { + if (array_key_exists($attr_name, static::$email_mapping)) + { + $email_key = static::$email_mapping[$attr_name]; + if (!array_key_exists($email_key[0], $this->emails)) + $this->emails[$email_key[0]] = array ( EMAIL_DISPLAY => "", EMAIL_TRANSPORT => "", EMAIL_EMAIL => "", EMAIL_EMAIL2 => ""); + $this->emails[$email_key[0]][$email_key[1]] = $value; + } + } + + return $rc; + } + + function evaluateAddressAttribute($attr_type, $attr_name, $value, $length) + { + $rc = 0; + + if ($length > 0) + { + if (array_key_exists($attr_name, static::$address_mapping)) + { + $address_key = static::$address_mapping[$attr_name]; + if (!array_key_exists($address_key[0], $this->addresses)) + $this->addresses[$address_key[0]] = array ( ); + $this->addresses[$address_key[0]][$address_key[1]] = $value; + } + } + + return $rc; + } + + function evaluateHomepageAttribute($attr_type, $attr_name, $value, $length) + { + $rc = 0; + + if ($length > 0) + { + if (array_key_exists($attr_name, static::$homepage_mapping)) + { + $homepage_key = static::$homepage_mapping[$attr_name]; + $this->homepages[$homepage_key] = $value; + $rc = 1; + tnef_log("Setting homepage '$homepage_key' to value '$value'"); + } + } + + return $rc; + } + +} diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/constants.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/constants.php new file mode 100644 index 000000000..5ccb920bb --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/constants.php @@ -0,0 +1,203 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ + +define("TNEF_SIGNATURE", 0x223e9f78); +define("TNEF_LVL_MESSAGE", 0x01); +define("TNEF_LVL_ATTACHMENT", 0x02); + +define("TNEF_TRIPLES", 0x00000000); +define("TNEF_STRING", 0x00010000); +define("TNEF_TEXT", 0x00020000); +define("TNEF_DATE", 0x00030000); +define("TNEF_SHORT", 0x00040000); +define("TNEF_LONG", 0x00050000); +define("TNEF_BYTE", 0x00060000); +define("TNEF_WORD", 0x00070000); +define("TNEF_DWORD", 0x00080000); +define("TNEF_MAX", 0x00090000); + +define("TNEF_AIDOWNER", TNEF_LONG | 0x0008); +define("TNEF_AREQUESTRES", TNEF_SHORT | 0x0009); +define("TNEF_AFROM", TNEF_TRIPLES | 0x8000); +define("TNEF_ASUBJECT", TNEF_STRING | 0x8004); +define("TNEF_ADATESENT", TNEF_DATE | 0x8005); +define("TNEF_ADATERECEIVED", TNEF_DATE | 0x8006); +define("TNEF_ASTATUS", TNEF_BYTE | 0x8007); +define("TNEF_AMCLASS", TNEF_WORD | 0x8008); +define("TNEF_AMESSAGEID", TNEF_STRING | 0x8009); +define("TNEF_ABODYTEXT", TNEF_TEXT | 0x800c); +define("TNEF_APRIORITY", TNEF_SHORT | 0x800d); +define("TNEF_ATTACHDATA", TNEF_BYTE | 0x800f); +define("TNEF_AFILENAME", TNEF_STRING | 0x8010); +define("TNEF_ATTACHMETAFILE", TNEF_BYTE | 0x8011); +define("TNEF_AATTACHCREATEDATE", TNEF_DATE | 0x8012); +define("TNEF_AATTACHMODDATE", TNEF_DATE | 0x8013); +define("TNEF_ADATEMODIFIED", TNEF_DATE | 0x8020); +define("TNEF_ARENDDATA", TNEF_BYTE | 0x9002); +define("TNEF_AMAPIPROPS", TNEF_BYTE | 0x9003); +define("TNEF_AMAPIATTRS", TNEF_BYTE | 0x9005); +define("TNEF_AVERSION", TNEF_DWORD | 0x9006); +define("TNEF_AOEMCODEPAGE", TNEF_BYTE | 0x9007); + +define("TNEF_MAPI_NULL", 0x0001); +define("TNEF_MAPI_SHORT", 0x0002); +define("TNEF_MAPI_INT", 0x0003); +define("TNEF_MAPI_FLOAT", 0x0004); +define("TNEF_MAPI_DOUBLE", 0x0005); +define("TNEF_MAPI_CURRENCY", 0x0006); +define("TNEF_MAPI_APPTIME", 0x0007); +define("TNEF_MAPI_ERROR", 0x000a); +define("TNEF_MAPI_BOOLEAN", 0x000b); +define("TNEF_MAPI_OBJECT", 0x000d); +define("TNEF_MAPI_INT8BYTE", 0x0014); +define("TNEF_MAPI_STRING", 0x001e); +define("TNEF_MAPI_UNICODE_STRING", 0x001f); +define("TNEF_MAPI_SYSTIME", 0x0040); +define("TNEF_MAPI_CLSID", 0x0048); +define("TNEF_MAPI_BINARY", 0x0102); + +define("TNEF_MAPI_MV_FLAG", 0x1000); +define("TNEF_MAPI_NAMED_TYPE_ID", 0x0000); +define("TNEF_MAPI_NAMED_TYPE_STRING", 0x0001); + +define("TNEF_MAPI_SUBJECT_PREFIX", 0x003D); +define("TNEF_MAPI_SENT_REP_NAME", 0x0042); +define("TNEF_MAPI_ORIGINAL_AUTHOR", 0x004D); +define("TNEF_MAPI_SENT_REP_ADDRTYPE", 0x0064); +define("TNEF_MAPI_SENT_REP_EMAIL_ADDR", 0x0065); +define("TNEF_MAPI_CONVERSATION_TOPIC", 0x0070); +define("TNEF_MAPI_SENDER_NAME", 0x0c1A); +define("TNEF_MAPI_SENDER_ADDRTYPE", 0x0c1E); +define("TNEF_MAPI_SENDER_EMAIL_ADDRESS", 0x0c1F); +define("TNEF_MAPI_NORMALIZED_SUBJECT", 0x0E1D); +define("TNEF_MAPI_ATTACH_SIZE", 0x0E20); +define("TNEF_MAPI_ATTACH_NUM", 0x0E21); +define("TNEF_MAPI_ACCESS_LEVEL", 0x0FF7); +define("TNEF_MAPI_MAPPING_SIGNATURE", 0x0FF8); +define("TNEF_MAPI_RECORD_KEY", 0x0FF9); +define("TNEF_MAPI_STORE_RECORD_KEY", 0x0FFA); +define("TNEF_MAPI_STORE_ENTRY_ID", 0x0FFB); +define("TNEF_MAPI_OBJECT_TYPE", 0x0FFE); +define("TNEF_MAPI_BODY", 0x1000); +define("TNEF_MAPI_RTF_SYNC_BODY_TAG", 0x1008); +define("TNEF_MAPI_RTF_COMPRESSED", 0x1009); +define("TNEF_MAPI_BODY_HTML", 0x1013); +define("TNEF_MAPI_NATIVE_BODY", 0x1016); +define("TNEF_MAPI_DISPLAY_NAME", 0x3001); +define("TNEF_MAPI_CREATION_TIME", 0x3007); +define("TNEF_MAPI_MODIFICATION_TIME", 0x3008); +define("TNEF_MAPI_ATTACH_DATA", 0x3701); +define("TNEF_MAPI_ATTACH_ENCODING", 0x3702); +define("TNEF_MAPI_ATTACH_EXTENSION", 0x3703); +define("TNEF_MAPI_ATTACH_METHOD", 0x3705); +define("TNEF_MAPI_ATTACH_LONG_FILENAME", 0x3707); +define("TNEF_MAPI_RENDERING_POSITION", 0x370B); +define("TNEF_MAPI_ATTACH_MIME_TAG", 0x370E); +define("TNEF_MAPI_ACCOUNT", 0x3A00); +define("TNEF_MAPI_GENERATION", 0x3A05); +define("TNEF_MAPI_GIVEN_NAME", 0x3A06); +define("TNEF_MAPI_BUSINESS_TEL_NUMBER", 0x3A08); +define("TNEF_MAPI_HOME_TEL_NUMBER", 0x3A09); +define("TNEF_MAPI_INITIALS", 0x3A0A); +define("TNEF_MAPI_KEYWORDS", 0x3A0B); +define("TNEF_MAPI_LANGUAGE", 0x3A0C); +define("TNEF_MAPI_LOCATION", 0x3A0D); +define("TNEF_MAPI_SURNAME", 0x3A11); +define("TNEF_MAPI_POSTAL_ADDRESS", 0x3A15); +define("TNEF_MAPI_COMPANY_NAME", 0x3A16); +define("TNEF_MAPI_TITLE", 0x3A17); +define("TNEF_MAPI_DEPARTMENT_NAME", 0x3A18); +define("TNEF_MAPI_OFFICE_LOCATION", 0x3A19); +define("TNEF_MAPI_PRIMARY_TEL_NUMBER", 0x3A1A); +define("TNEF_MAPI_BUSINESS2_TEL_NUMBER", 0x3A1B); +define("TNEF_MAPI_MOBILE_TEL_NUMBER", 0x3A1C); +define("TNEF_MAPI_RADIO_TEL_NUMBER", 0x3A1D); +define("TNEF_MAPI_CAR_TEL_NUMBER", 0x3A1E); +define("TNEF_MAPI_OTHER_TEL_NUMBER", 0x3A1F); +define("TNEF_MAPI_PAGER_TEL_NUMBER", 0x3A21); +define("TNEF_MAPI_PRIMARY_FAX_NUMBER", 0x3A23); +define("TNEF_MAPI_BUSINESS_FAX_NUMBER", 0x3A24); +define("TNEF_MAPI_HOME_FAX_NUMBER", 0x3A25); +define("TNEF_MAPI_COUNTRY", 0x3A26); +define("TNEF_MAPI_LOCALTY", 0x3A27); +define("TNEF_MAPI_STATE_OR_PROVINCE", 0x3A28); +define("TNEF_MAPI_STREET_ADDRESS", 0x3A29); +define("TNEF_MAPI_POSTAL_CODE", 0x3A2A); +define("TNEF_MAPI_POST_OFFICE_BOX", 0x3A2B); +define("TNEF_MAPI_TELEX_NUMBER", 0x3A2C); +define("TNEF_MAPI_ISDN_NUMBER", 0x3A2D); +define("TNEF_MAPI_ASSISTANT_TEL_NUMBER", 0x3A2E); +define("TNEF_MAPI_HOME2_TEL_NUMBER", 0x3A2F); +define("TNEF_MAPI_ASSISTANT", 0x3A30); +define("TNEF_MAPI_MIDDLE_NAME", 0x3A44); +define("TNEF_MAPI_DISPLAYNAME_PREFIX", 0x3A45); +define("TNEF_MAPI_PROFESSION", 0x3A46); +define("TNEF_MAPI_SPOUSE_NAME", 0x3A48); +define("TNEF_MAPI_MANAGER_NAME", 0x3A4E); +define("TNEF_MAPI_NICKNAME", 0x3A4F); +define("TNEF_MAPI_PERSONAL_HOME_PAGE", 0x3A50); +define("TNEF_MAPI_BUSINESS_HOME_PAGE", 0x3A51); +define("TNEF_MAPI_CONTACT_EMAIL_ADDR", 0x3A56); +define("TNEF_MAPI_HOME_ADDR_CITY", 0x3A59); +define("TNEF_MAPI_HOME_ADDR_COUNTRY", 0x3A5A); +define("TNEF_MAPI_HOME_ADDR_ZIP", 0x3A5B); +define("TNEF_MAPI_HOME_ADDR_STATE", 0x3A5C); +define("TNEF_MAPI_HOME_ADDR_STREET", 0x3A5D); +define("TNEF_MAPI_HOME_ADDR_PO_BOX", 0x3A5E); +define("TNEF_MAPI_OTHER_ADDR_CITY", 0x3A5F); +define("TNEF_MAPI_OTHER_ADDR_COUNTRY", 0x3A60); +define("TNEF_MAPI_OTHER_ADDR_ZIP", 0x3A61); +define("TNEF_MAPI_OTHER_ADDR_STATE", 0x3A62); +define("TNEF_MAPI_OTHER_ADDR_STREET", 0x3A63); +define("TNEF_MAPI_OTHER_ADDR_PO_BOX", 0x3A64); + +define("TNEF_MAPI_OTHER_HOME_PAGE", 0x804F); +define("TNEF_MAPI_EMAIL1_DISPLAY", 0x8080); +define("TNEF_MAPI_EMAIL1_TRANSPORT", 0x8082); +define("TNEF_MAPI_EMAIL1_EMAIL", 0x8083); +define("TNEF_MAPI_EMAIL1_EMAIL2", 0x8084); +define("TNEF_MAPI_EMAIL2_DISPLAY", 0x8090); +define("TNEF_MAPI_EMAIL2_TRANSPORT", 0x8092); +define("TNEF_MAPI_EMAIL2_EMAIL", 0x8093); +define("TNEF_MAPI_EMAIL2_EMAIL2", 0x8094); +define("TNEF_MAPI_EMAIL3_DISPLAY", 0x80A0); +define("TNEF_MAPI_EMAIL3_TRANSPORT", 0x80A2); +define("TNEF_MAPI_EMAIL3_EMAIL", 0x80A3); +define("TNEF_MAPI_EMAIL3_EMAIL2", 0x80A4); + + + +// used in RTF +// +define("CRTF_UNCOMPRESSED", 0x414c454d); +define("CRTF_COMPRESSED", 0x75465a4c); + + +// used in VCARD +// +define ("EMAIL_DISPLAY", 1); +define ("EMAIL_TRANSPORT", 2); +define ("EMAIL_EMAIL", 3); +define ("EMAIL_EMAIL2", 4); + +define ("ADDRESS_STREET", "Street"); +define ("ADDRESS_ZIP", "Zip"); +define ("ADDRESS_CITY", "City"); +define ("ADDRESS_COUNTRY", "Country"); +define ("ADDRESS_STATE", "State"); +define ("ADDRESS_PO_BOX", "PO Box"); diff --git a/snappymail/v/0.0.0/app/libraries/TNEFDecoder/functions.php b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/functions.php new file mode 100644 index 000000000..cd37d5bd7 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/TNEFDecoder/functions.php @@ -0,0 +1,96 @@ + + * Copyright (c) 2003 Bernd Wiegmann + * Copyright (c) 2002 Graham Norburys + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * @package plugins + * @subpackage tnef_decoder + * + */ + + + +/** + * Debugging output --> to a file (/tmp/squirrelmail_tnef_decoder.log) + * + * Note this assumes a world-writable /tmp directory + * + * @param string $string The text to be logged + * + * @return boolean TRUE on success, FALSE when a problem occurred + * + */ +function tnef_log($string) +{ + \SnappyMail\Log::debug('TNEF', $string); +} + + + + +/** + * TNEF decoding helper function + * + */ +function tnef_getx($size, TNEFBuffer $buf) +{ + return $buf->getBytes($size); +} + + + +/** + * TNEF decoding helper function + * + */ +function tnef_geti8(TNEFBuffer $buf) +{ + $bytes = $buf->getBytes(1, $buf); + if ($bytes === null) { + return null; + } + + return ord($bytes[0]); +} + + + +/** + * TNEF decoding helper function + * + */ +function tnef_geti16(TNEFBuffer $buf): ?int +{ + $bytes = $buf->getBytes(2, $buf); + if ($bytes === null) { + return null; + } + + return ord($bytes[0]) + + (ord($bytes[1]) << 8); +} + + + +/** + * TNEF decoding helper function + * + */ +function tnef_geti32(TNEFBuffer $buf): ?int +{ + $bytes = $buf->getBytes(4, $buf); + if ($bytes === null) { + return null; + } + + return ord($bytes[0]) + + (ord($bytes[1]) << 8) + + (ord($bytes[2]) << 16) + + (ord($bytes[3]) << 24); +} diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/rtf/controlsymbol.php b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/controlsymbol.php new file mode 100644 index 000000000..01cdddf41 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/controlsymbol.php @@ -0,0 +1,9 @@ + Groups\ColorTable::class, + 'filetbl' => Groups\FileTable::class, + 'fonttbl' => Groups\FontTable::class, + 'generator' => Groups\Generator::class, + 'info' => Groups\Info::class, + 'listtable' => Groups\ListTable::class, + 'listtext' => Groups\ListText::class, + 'listoverridetable' => Groups\ListOverrideTable::class, + 'pict' => Groups\Pict::class, + 'stylesheet' => Groups\StyleSheet::class + ]; + + public function __construct(string $rtf) + { + /* + * Attempt to parse an RTF string. + */ + $this->rtf = $rtf; + $this->len = \strlen($rtf); + $this->pos = 0; + $this->root = null; + $this->group = null; + $this->char = ''; + $this->uc = []; + + while ($this->pos < $this->len-1) { + // Read next character: + $this->nextChar(); + + // Ignore \r and \n + if ($this->is_endofline()) continue; + + // What type of character is this? + switch ($this->char) + { + // Group handling + case '{': + $this->startGroup(); + break; + case '}': + $this->endGroup(); + break; + + case '\\': + // If there is no current group, then this is not a valid RTF file. + if (!$this->group) { + throw new \RuntimeException('Parse error: RTF text outside of group.'); + } + // Beginning of an RTF control word or control symbol. + // Look ahead by one character to see if it starts with + // a letter (control word) or another symbol (control symbol): + $this->group->children[] = \ctype_alpha($this->nextChar(true)) + ? $this->parseControlWord() + : $this->parseControlSymbol(); + break; + + default: + $this->parseText(); + break; + } + } + $this->rtf = ''; + $this->group = null; + } + + // Get the next character from the RTF stream. + // Parsing is aborted when reading beyond end of input string. + protected function nextChar(bool $peek = false): string + { + if ($this->pos >= $this->len) { + $this->char = null; + throw new \RuntimeException("Parse error: Tried to read past end of input; RTF is probably truncated."); + } + if ($peek) { + return $this->rtf[$this->pos]; + } + $this->char = $this->rtf[$this->pos++]; + return $this->char; + } + + /* + * (Helper method) + * Is the current character end-of-line (EOL)? + */ + protected function is_endofline(): bool + { + if (\strspn($this->char, "\r\n")) { + // Checks for a Windows/Acron type EOL + if (\strspn($this->nextChar(true), "\r\n")) { + ++$this->pos; + } + return true; + } + return false; + } + + // Store state of document on stack. + protected function startGroup() + { + $group = new Group(); + if ('\\' === $this->nextChar(true)) { + $cword = null; + if (\ctype_alpha($this->rtf[$this->pos+1])) { + $this->nextChar(); + $cword = $this->parseControlWord(); + // Replace group with special group? + if (isset(static::$groups[$cword->word])) { + $group = new static::$groups[$cword->word](); + } else { + $group->children[] = $cword; + } + } + else if ('*' === $this->rtf[$this->pos+1]) { + $group = new Groups\Destination(); + $this->nextChar(); + $this->parseControlSymbol(); +// $group->children[] = $this->parseControlSymbol(); + if (\ctype_alpha($this->rtf[$this->pos+1])) { + /** + * Destinations added after the 1987 RTF Specification may be preceded by the control symbol \* + * This control symbol identifies destinations whose related text should be + * ignored if the RTF reader does not recognize the destination control word. + */ + $this->nextChar(); + $cword = $this->parseControlWord(); + // Replace group with special group? + if (isset(static::$groups[$cword->word])) { + $group = new static::$groups[$cword->word](); + } else { + $group->children[] = $cword; + } + } + } + } + + // Is there a current group? Then make the new group its child: + if ($this->group) { + $group->parent = $this->group; + $this->group->children[] = $group; + $this->uc[] = \end($this->uc); + } + // If there is no parent group, then set this group + // as the root group. + else { + $this->root = $group; + // Create uc stack and insert the first default value + $this->uc = [1]; + } + // Set the new group as the current group: + $this->group = $group; + } + + // Retrieve state of document from stack. + protected function endGroup() + { + $this->group = $this->group->parent; + \array_pop($this->uc); + } + + protected function parseControlSymbol(): Entity + { + // Read symbol (one character only). + $symbol = $this->nextChar(); + + // Exceptional case: + // Treat EOL symbols as \par control word + if ($this->is_endofline()) { + $cword = new ControlWord(); + $cword->word = 'par'; + $cword->parameter = 0; + return $cword; + } + + // Symbols ordinarily have no parameter. However, + // if this is \' (a single quote), then it is + // followed by a 2-digit hex-code: + $parameter = 0; + if ('\'' === $symbol) { + $parameter = \hexdec($this->nextChar() . $this->nextChar()); + } + + // Add new control symbol as a child to the current group: + $csymbol = new ControlSymbol(); + $csymbol->symbol = $symbol; + $csymbol->parameter = $parameter; + return $csymbol; + } + + protected function parseControlWord(): ControlWord + { + // Read letters until a non-letter is reached. + $word = ''; + $this->nextChar(); + while (\ctype_alpha($this->char)) { + $word .= $this->char; + $this->nextChar(); + } + + // Read parameter (if any) consisting of digits. + // Parameter may be negative, i.e., starting with a '-' + $negative = false; + if ('-' === $this->char) { + $this->nextChar(); + $negative = true; + } + $parameter = null; + while (\ctype_digit($this->char)) { + if (!$parameter) $parameter = 0; + $parameter = $parameter * 10 + (int) $this->char; + $this->nextChar(); + } + // If no parameter present, assume control word's default (usually 1) + // If no default then assign 0 to the parameter + if (null === $parameter) $parameter = 1; + + // Convert parameter to a negative number when applicable + if ($negative) $parameter = -$parameter; + + // Update uc value + if ('uc' === $word) { + \array_pop($this->uc); + $this->uc[] = $parameter; + } + + // Skip space delimiter + if (' ' !== $this->char && !$this->is_endofline()) { + --$this->pos; + } + + // If this is \u, then the parameter will be followed + // by {$this->uc} characters. + if ('u' === $word) { + // Convert parameter to unsigned decimal unicode + if ($negative) { + $parameter = 65536 + $parameter; + } + + // Will ignore replacement characters $uc times + $uc = \end($this->uc); + while (0 < $uc--) { + $this->nextChar(); + // If the replacement character is encoded as + // hexadecimal value \'hh then jump over it + if ('\\' === $this->char && '\'' === $this->rtf[$this->pos]) + $this->pos = $this->pos + 3; + + // Break if it's an RTF scope delimiter + else if (\strspn($this->char, '{}')) + break; + } + } + + $cword = new ControlWord(); + $cword->word = $word; + $cword->parameter = $parameter; + return $cword; + } + + protected function parseText(): void + { + // If there is no current group, then this is not a valid RTF file. + if (!$this->group) { + throw new \RuntimeException('Parse error: RTF text outside of group.'); + } + + // Parse plain text up to backslash or brace, + // unless escaped. + $text = ''; + $terminate = false; + do + { + // Ignore EOL characters + if ($this->is_endofline()) { + $this->nextChar(); + continue; + } + // Is this an escape? + if ('\\' == $this->char) { + // Perform lookahead to see if this + // is really an escape sequence. + $this->nextChar(); + switch ($this->char) + { + case '\\': break; + case '{': break; + case '}': break; + default: + // Not an escape. Roll back. + $this->pos = $this->pos - 2; + $terminate = true; + break; + } + } else if (\strspn($this->char, '{}')) { + --$this->pos; + $terminate = true; + } + + if (!$terminate) { + // Save plain text + $text .= $this->char; + $this->nextChar(); + } + } + while (!$terminate && $this->pos < $this->len); + + // Create new Text element: + $text = new Text($text); + + // Add text as a child to the current group: + $this->group->children[] = $text; + } + + public function toHTML(): string + { + return (new HtmlFormatter())->format($this); + } +} diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/rtf/encoding.php b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/encoding.php new file mode 100644 index 000000000..85f91af53 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/encoding.php @@ -0,0 +1,90 @@ + 'CP1252', // ANSI: Western Europe + 1 => 'CP1252', //*Default + 2 => 'CP1252', //*Symbol + 3 => null, // Invalid + 77 => 'MAC', //*also [MacRoman]: Macintosh + 128 => 'CP932', //*or [Shift_JIS]?: Japanese + 129 => 'CP949', //*also [UHC]: Korean (Hangul) + 130 => 'CP1361', //*also [JOHAB]: Korean (Johab) + 134 => 'CP936', //*or [GB2312]?: Simplified Chinese + 136 => 'CP950', //*or [BIG5]?: Traditional Chinese + 161 => 'CP1253', // Greek + 162 => 'CP1254', // Turkish (latin 5) + 163 => 'CP1258', // Vietnamese + 177 => 'CP1255', // Hebrew + 178 => 'CP1256', // Simplified Arabic + 179 => 'CP1256', //*Traditional Arabic + 180 => 'CP1256', //*Arabic User + 181 => 'CP1255', //*Hebrew User + 186 => 'CP1257', // Baltic + 204 => 'CP1251', // Russian (Cyrillic) + 222 => 'CP874', // Thai + 238 => 'CP1250', // Eastern European (latin 2) + 254 => 'CP437', //*also [IBM437][437]: PC437 + 255 => 'CP437' //*OEM still PC437 + ); + + if (isset($charset[$fcharset])) { + return $charset[$fcharset]; + } + \trigger_error("Unknown charset: {$fcharset}"); + return null; + } + + public static function getFromCodepage($cpg): ?string + { + $codePage = array ( + 'ansi' => 'CP1252', + 'mac' => 'MAC', + 'pc' => 'CP437', + 'pca' => 'CP850', + 437 => 'CP437', // United States IBM + 708 => 'ASMO-708', // also [ISO-8859-6][ARABIC] Arabic + /* Not supported by iconv + 709, => '' // Arabic (ASMO 449+, BCON V4) + 710, => '' // Arabic (transparent Arabic) + 711, => '' // Arabic (Nafitha Enhanced) + 720, => '' // Arabic (transparent ASMO) + */ + 819 => 'CP819', // Windows 3.1 (US and Western Europe) + 850 => 'CP850', // IBM multilingual + 852 => 'CP852', // Eastern European + 860 => 'CP860', // Portuguese + 862 => 'CP862', // Hebrew + 863 => 'CP863', // French Canadian + 864 => 'CP864', // Arabic + 865 => 'CP865', // Norwegian + 866 => 'CP866', // Soviet Union + 874 => 'CP874', // Thai + 932 => 'CP932', // Japanese + 936 => 'CP936', // Simplified Chinese + 949 => 'CP949', // Korean + 950 => 'CP950', // Traditional Chinese + 1250 => 'CP1250', // Windows 3.1 (Eastern European) + 1251 => 'CP1251', // Windows 3.1 (Cyrillic) + 1252 => 'CP1252', // Western European + 1253 => 'CP1253', // Greek + 1254 => 'CP1254', // Turkish + 1255 => 'CP1255', // Hebrew + 1256 => 'CP1256', // Arabic + 1257 => 'CP1257', // Baltic + 1258 => 'CP1258', // Vietnamese + 1361 => 'CP1361'); // Johab + + if (isset($codePage[$cpg])) { + return $codePage[$cpg]; + } + \trigger_error("Unknown codepage: {$cpg}"); + return null; + } +} diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/rtf/entity.php b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/entity.php new file mode 100644 index 000000000..1edc89dc8 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/entity.php @@ -0,0 +1,11 @@ +word) { + case 'f': + $this->uid = $entity->parameter; + break; + + // + case 'froman': $this->family = 'serif'; break; + case 'fswiss': $this->family = 'sans-serif'; break; + case 'fmodern': $this->family = 'monospace'; break; + case 'fscript': $this->family = 'cursive'; break; + case 'fdecor': $this->family = 'fantasy'; break; + // case 'fnil': break; // default font + // case 'ftech': break; // symbol + // case 'fbidi': break; // bidirectional font + + case 'fcharset': + $this->charset = Encoding::getFromCharset($entity->parameter); + break; + + case 'fprq': + $this->fprq = $entity->parameter; + break; + + case 'cpg': + $this->codepage = Encoding::getFromCodepage($entity->parameter); + break; + } + } + + // + else if ($entity instanceof Text) { + // Store font name (except ; delimiter at end) + $this->name = \substr($entity->text, 0, -1); + } + + /* + else if ($entity instanceof Group) { + // possible subgroups: + // + // + // + // + // + } + */ + } + + public function __toString(): string + { + $list = []; + if ($this->name) { + // If the name has double quotes replace them with single quotes + $this->name = \str_replace('"', "'", $this->name); + $list[] = $this->name; + } + if ($this->family) { + $list[] = $this->family; + } + return $list ? 'font-family:' . \implode(', ', $list) : ''; + } +} diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/rtf/group.php b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/group.php new file mode 100644 index 000000000..f27a2d160 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/group.php @@ -0,0 +1,32 @@ +children[0])) { + $child = $this->children[0]; + + // If the first child is a control word, then + // the group type is the word. + if ($child instanceof ControlWord) { + return $child->word; + } + + // If the first child is a control symbol, then + // the group type is * for a special symbol, or null. + if ($child instanceof ControlSymbol) { + return ('*' === $child->symbol) ? '*' : null; + } + } + + // If first child is neither word nor symbol, then + // group type is null. + return null; + } +} diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/colortable.php b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/colortable.php new file mode 100644 index 000000000..263c18541 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/colortable.php @@ -0,0 +1,58 @@ + '{' \colortbl + '}' + * ? & \ctintN? & \cshadeN? \redN? & \greenN? & \blueN? ';' + * \cmaindarkone | \cmainlightone | \cmaindarktwo | \cmainlighttwo | + * \caccentone | \caccenttwo | \caccentthree | \caccentfour | \caccentfive | + * \caccentsix | \chyperlink | \cfollowedhyperlink | \cbackgroundone | + * \ctextone | \cbackgroundtwo | \ctexttwo + */ +class ColorTable extends Group +{ + private static $themecolors = [ + 'cmaindarkone', 'cmainlightone', 'cmaindarktwo', 'cmainlighttwo', + 'caccentone', 'caccenttwo', 'caccentthree', 'caccentfour', 'caccentfive', + 'caccentsix', 'chyperlink', 'cfollowedhyperlink', 'cbackgroundone', + 'ctextone', 'cbackgroundtwo', 'ctexttwo' + ]; + + public function getColors(): array + { + $colortbl = [ + null +// 'inherit' +// 'initial' +// 'unset' + ]; + $color = []; + foreach ($this->children as $i => $entity) { + if ($entity instanceof ControlWord) { + if (isset(static::$themecolors[$entity->word])) { + $color['themecolor'] = $entity->word; + } else { + $color[$entity->word] = $entity->parameter; + } + } else if ($entity instanceof Text) { + // This is a delimiter ';' === $entity->text + if ($i) { + if (isset($color['red'])) { + $colortbl[] = "rgb({$color['red']},{$color['green']},{$color['blue']})"; + // hex string format +// $colortbl[] = \sprintf('#%02x%02x%02x', $color['red'], $color['green'], $color['blue']); + } else if (isset($color['themecolor'])) { + $colortbl[] = "var(--rtf-{$color['themecolor']})"; + } + } + $color = []; + } + } + return $colortbl; + } +} diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/destination.php b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/destination.php new file mode 100644 index 000000000..df7edb56b --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/destination.php @@ -0,0 +1,7 @@ + '{' \fonttbl ( | ('{' '}'))+ '}' + * ? \fN \fcharsetN? \fprq? ? ? ? \cpgN? ? ';' + * \flomajor | \fhimajor | \fdbmajor | \fbimajor | \flominor | \fhiminor | \fdbminor | \fbiminor + * \fnil | \froman | \fswiss | \fmodern | \fscript | \fdecor | \ftech | \fbidi + * '{\*' \panose '}' + * '{\*' \fname #PCDATA ';}' + * #PCDATA + * '{\*' \falt #PCDATA '}' + * '{\*' \fontemb ? ? '}' + * \ftnil | \fttruetype + * '{\*' \fontfile \cpgN? #PCDATA '}' + */ +class FontTable extends Group +{ + public function getFonts(): array + { + $fonts = []; + $basefont = null; + foreach ($this->children as $fontinfo) { + if ($fontinfo instanceof Group) { + $font = new FontInfo(); + foreach ($fontinfo->children as $entity) { + $font->addEntity($entity); + } + $fonts[$font->uid] = $font; + } else { + $basefont = $basefont ?: new FontInfo(); + $basefont->addEntity($fontinfo); + } + } + if ($basefont && !$fonts) { + $fonts[$basefont->uid] = $basefont; + } + return $fonts; + } +} diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/generator.php b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/generator.php new file mode 100644 index 000000000..a2b4f17b9 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/generator.php @@ -0,0 +1,7 @@ +children as $child) { + if ($child instanceof ControlWord) { + switch ($child->word) { + // Picture Format + case 'emfblip': + case 'pngblip': + case 'jpegblip': + $format = \substr($child->word, 0, -4); + break; + case 'macpict': + $format = 'pict'; + break; +// case 'wmetafile': $format = 'bmp'; break; + + // Picture size and scaling + case 'picw': + $style[] = "width:{$child->parameter}px"; + break; + case 'pich': + $style[] = "height:{$child->parameter}px"; + break; + case 'picscalex': +// $style[] = "width:{$child->parameter}%"; + break; + case 'picscaley': +// $style[] = "height:{$child->parameter}%"; + break; + + // Binary or Hexadecimal Data ? + case 'bin': $binarySize = $child->parameter; break; + default: break; + } + + } elseif ($child instanceof Text) { // store Data + $data = $child->text; + } + } + + if ($binarySize) { + $data = \substr($data, 0, $binarySize); + } else { + $data = \pack('H*',$data); + } + + if ($style) { + $style = ' style="' . \implode(';', $style) . '"'; + } + + return ""; + } +} diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/stylesheet.php b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/stylesheet.php new file mode 100644 index 000000000..3ae4ebed8 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/groups/stylesheet.php @@ -0,0 +1,7 @@ +output = ''; + // Keep track of style modifications + $this->previousStyle = null; + // and create a stack of styles + $this->styles = array(); + // Put an initial standard style onto the stack + $this->style = new Style(); + $this->styles[] = $this->style; + + // Keep track of opened html tags + $this->openedTags = [ + 'span' => false, + 'p' => false + ]; + // Create the first paragraph + $this->openTag('p'); + // Begin format + $this->processGroup($document->root); + // Close opened tags + $this->closeTags(true); + return $this->output; + } + + protected function processGroup(Group $group) + { + if ($group instanceof Groups\Destination) { + $this->processDestination($group->children); + return; + } + + if ($group instanceof Groups\ColorTable) { + Style::$colortbl = $group->getColors(); + return; + } + if ($group instanceof Groups\FontTable) { + Style::$fonttbl = $group->getFonts(); + return; + } + if ($group instanceof Groups\Pict) { + $this->output .= $group->getHTML(); + return; + } + if ($group instanceof Groups\StyleSheet) { + // Stylesheet extraction not yet supported + return; + } + + if ($group instanceof Groups\FileTable + || $group instanceof Groups\Info + || $group instanceof Groups\ListTable + || $group instanceof Groups\ListText + || $group instanceof Groups\ListOverrideTable + ) { + // Skip + return; + } + + // Special group processing: + switch ($group->getType()) + { + case 'nonshppict': + // Ignore alternative images + return; + } + + // Pictures extraction not yet supported + //if (\substr($group->getType(), 0, 4) == "pict") return; + + // Push a new style onto the stack: + $this->style = clone $this->style; + $this->styles[] = $this->style; + + foreach ($group->children as $child) { + $this->processEntity($child); + } + + // Pop style from stack + \array_pop($this->styles); + $this->style = \end($this->styles); + } + + protected function processDestination(array $dest) + { + // Check if this is a Word 97 picture + if ($dest[0] instanceof ControlWord && 'shppict' == $dest[0]->word) { + $c = \count($dest); + for ($i = 1; $i < $c; ++$i) { + $this->processEntity($dest[$i]); + } + } + } + + protected function processEntity(Entity $entry) + { + if ($entry instanceof Group) $this->processGroup($entry); + else if ($entry instanceof ControlWord) $this->processControlWord($entry); + else if ($entry instanceof ControlSymbol) $this->processControlSymbol($entry); + else if ($entry instanceof Text) $this->write($entry); + } + + protected function processControlWord(ControlWord $word) + { + switch ($word->word) { + case 'plain': // Reset font formatting properties to default. + case 'pard': // Reset to default paragraph properties. + $this->style->reset($this->defaultFont); + break; + + /* Font formatting properties: */ + + case 'b': // Bold + case 'caps': // All capitals + case 'embo': // Emboss + case 'i': // Italic + case 'impr': // Engrave (imprint) + case 'outl': // Outline + case 'scaps': // Small capitals + case 'shad': // Shadow + case 'strike': // Strike-through + case 'striked': // Double strike-through + $this->style->{$word->word} = $word->parameter; + break; + case 'sub': // Subscripts + case 'super': // Superscripts + $this->style->verticalAlign = $word->word; + break; + case 'nosupersub': // Turns off superscripting or subscripting + $this->style->verticalAlign = null; + break; + case 'ul': // Underline + case 'uld': // Dotted underline + case 'uldash': // Dashed underline + case 'uldashd': // Dash-dotted underline + case 'uldashdd': // Dash-dot-dotted underline + case 'uldb': // Double underline + case 'ulhwave': // Heavy wave underline + case 'ulldash': // Long dashed underline + case 'ulnone': // no underline + case 'ulth': // Thick underline + case 'ulthd': // Thick dotted underline + case 'ulthdash': // Thick dashed underline + case 'ulthdashd': // Thick dash-dotted underline + case 'ulthdashdd': // Thick dash-dot-dotted underline + case 'ulthldash': // Thick long dashed underline + case 'ululdbwave': // Double wave underline + case 'ulw': // Word underline + case 'ulwave': // Wave underline + $this->style->underline = $word->word; + break; + case 'v': // hidden + $this->style->hidden = $word->parameter; + break; + case 'fs': // Font size in half-points + $this->style->fs = $word->parameter; + break; + case 'f': // Font number + $this->style->font = $word->parameter; + break; + case 'deff': // Store default font + $this->defaultFont = $word->parameter; + break; +/* + case 'ltrmark': + $this->style->dir = 'ltr'; + break; + case 'rtlmark': + $this->style->dir = 'rtl'; + break; + + \ab* Associated font is bold. + \acaps* Associated font is all capitals. + \acfN Associated foreground color (default is 0). + \adnN Associated font is subscript position in half-points (default is 6). + \aexpndN Expansion or compression of the space between characters in quarter-points; a negative value compresses (default is 0). + \afN Associated font number (default is 0). + \afsN Associated font size in half-points (default is 24). + \ai* Associated font is italic. + \alangN Language ID (see the standard language table) for the associated font. + \aoutl* Associated font is outline. + \ascaps* Associated font is small capitals. + \ashad* Associated font is shadow. + \astrike* Associated font is strikethrough. + \aul Associated font is continuous underline. \aul0 turns off all underlining for the alternate font. + \auld Associated font is dotted underline. + \auldb Associated font is double underline. + \aulnone Associated font is no longer underlined. + \aulw Associated font is word underline. + \aupN Superscript position in half-points (default is 6). + \fcsN N = 1 means South East Asian complex script; N = 0 means not South East Asian script + \loch The text consists of single-byte low-ANSI (0x00–0x7F) characters. + \hich The text consists of single-byte high-ANSI (0x80–0xFF) characters. + \dbch The text consists of double-byte characters. +*/ + + /* Colors */ + + case 'cf': + case 'chcfpat': + $this->style->fontcolor = $word->parameter; + break; + case 'cb': + case 'chcbpat': + $this->style->background = $word->parameter; + break; + case 'highlight': + case 'ulc': // Underline color + $this->style->{$word->word} = $word->parameter; + break; + + /* Special characters */ + + case 'lquote': $this->write('‘'); break; + case 'rquote': $this->write('’'); break; + case 'ldblquote': $this->write('“'); break; + case 'rdblquote': $this->write('”'); break; + case 'bullet': $this->write('•'); break; + case 'endash': $this->write('–'); break; + case 'emdash': $this->write('—'); break; + case 'enspace': $this->write(' '); break; + case 'emspace': $this->write(' '); break; + case 'qmspace': $this->write(' '); break; + case 'tab': $this->write("\t"); break; + case 'line': $this->output .= '
'; break; // "\r\n" +// case 'lbr': $this->output .= '
'; break; + case 'zwbo': $this->write("\xC2\x82"); break; + case 'zwnbo': $this->write("\xC2\x83"); break; + case 'zwj': $this->write("\xE2\x80\x8D"); break; + case 'zwnj': $this->write("\xE2\x80\x8C"); break; + + /* Unicode characters */ + + case 'u': + $this->write($this->decodeUnicode($word->parameter)); + break; + + /* Paragraphs */ + + case 'par': // End of paragraph + case 'row': // End of table row + // Close previously opened tags + $this->closeTags(); + // Begin a new paragraph + $this->openTag('p'); + break; + + /* Tables */ + case 'cell': // End of table cell + case 'nestcell': // End of nested table cell + case 'nestrow': // End of nested table row + break; + + /* Code pages */ + case 'ansi': + case 'mac': + case 'pc': + case 'pca': + $this->RTFencoding = Encoding::getFromCodepage($word->word); + break; + case 'ansicpg': + if ($word->parameter) { + $this->RTFencoding = Encoding::getFromCodepage($word->parameter); + } + break; + + case 'fromtext': // Indicates document was originally plain text email. + case 'fromhtml': // Indicates document was originally HTML email and may contain encapsulated HTML tags. + break; + + } + } + + protected function decodeUnicode($code, $srcEnc = 'UTF-8') + { + $utf8 = ''; + if ($srcEnc && 'UTF-8' != $srcEnc) { + // convert character to Unicode + $utf8 = \iconv($srcEnc, 'UTF-8', \chr($code)); + } + return $utf8 ? $utf8 : \mb_convert_encoding("&#{$code};", 'UTF-8', 'HTML-ENTITIES'); + } + + protected function write(string $txt) + { + //$tag = \str_replace('er', '', $this->style->verticalAlign ?: 'span'); // sub / sup / span + // Create a new 'span' element only when a style change occurs. + // 1st case: style change occured + // 2nd case: there is no change in style but the already created 'span' + // element is somehow closed (ex. because of an end of paragraph) + if (!$this->style->equals($this->previousStyle) || + ($this->style->equals($this->previousStyle) && !$this->openedTags['span']) + ) { + $this->closeTag('span'); + $this->previousStyle = clone $this->style; + $this->openTag('span', $this->style); + } + $this->output .= $txt; + } + + protected function openTag(string $tag, string $attr = '') + { + $this->output .= $attr ? "<{$tag} {$attr}>" : "<{$tag}>"; + $this->openedTags[$tag] = true; + } + + protected function closeTag(string $tag, bool $end = false) + { + if ($this->openedTags[$tag]) { + // Check for empty html elements + if (\substr($this->output , -\strlen("<{$tag}>")) == "<{$tag}>") { + if ('p' === $tag && !$end) { + // Replace empty 'p' element with a line break + $this->output = \substr($this->output ,0, -3) . "
"; + } else { + // Delete empty elements + $this->output = \substr($this->output ,0, -\strlen("<{$tag}>")); + } + } else { + $this->output .= ""; + } + $this->openedTags[$tag] = false; + } + } + + protected function closeTags(bool $end = false) + { + foreach ($this->openedTags as $tag => $b) { + $this->closeTag($tag, $end); + } + } + + protected function processControlSymbol(ControlSymbol $symbol) + { + if ("'" === $symbol->symbol) { + // "\'hh" = A hexadecimal value, based on the specified character set + $enc = $this->getSourceEncoding(); + $uchar = $this->decodeUnicode($symbol->parameter, $enc); + $this->write($uchar); + } else if ('~' === $symbol->symbol) { + // Non breaking space +// $this->write(' '); +// $this->write("\xC2\xA0"); + $this->write(' '); + } else if ('-' === $symbol->symbol) { + // Optional hyphen +// $this->write("­"); +// $this->write("\xC2\xAD"); + $this->write('­'); + } else if ('_' === $symbol->symbol) { + // Non breaking hyphen +// $this->write("‑"); +// $this->write("\xE2\x80\x91"); + $this->write('‑'); + } + } + + protected function getSourceEncoding() + { + if (isset($this->style->font)) { + if (isset(Style::$fonttbl[$this->style->font]->codepage)) { + return Style::$fonttbl[$this->style->font]->codepage; + } + if (isset(Style::$fonttbl[$this->style->font]->charset)) { + return Style::$fonttbl[$this->style->font]->charset; + } + } + return $this->RTFencoding; + } + + protected function ord_utf8($chr) + { + $ord0 = \ord($chr); + if ($ord0 >= 0 && $ord0 <= 127) + return $ord0; + + $ord1 = \ord($chr[1]); + if ($ord0 >= 192 && $ord0 <= 223) + return ($ord0 - 192) * 64 + ($ord1 - 128); + + $ord2 = \ord($chr[2]); + if ($ord0 >= 224 && $ord0 <= 239) + return ($ord0 - 224) * 4096 + ($ord1 - 128) * 64 + ($ord2 - 128); + + $ord3 = \ord($chr[3]); + if ($ord0 >= 240 && $ord0 <= 247) + return ($ord0 - 240) * 262144 + ($ord1 - 128) * 4096 + ($ord2 - 128) * 64 + ($ord3 - 128); + + $ord4 = \ord($chr[4]); + if ($ord0 >= 248 && $ord0 <= 251) + return ($ord0 - 248) * 16777216 + ($ord1 - 128) * 262144 + ($ord2 - 128) * 4096 + ($ord3 - 128) * 64 + ($ord4 - 128); + + if ($ord0 >= 252 && $ord0 <= 253) + return ($ord0 - 252) * 1073741824 + ($ord1 - 128) * 16777216 + ($ord2 - 128) * 262144 + ($ord3 - 128) * 4096 + ($ord4 - 128) * 64 + (\ord($chr[5]) - 128); + + \trigger_error("Invalid Unicode character: {$chr}"); + } +} + +class Style implements \Stringable +{ + public static + $fonttbl = [], + $colortbl = []; + + private static + $highlights = [ + 1 => 'Black', + 2 => 'Blue', + 3 => 'Cyan', + 4 => 'Green', + 5 => 'Magenta', + 6 => 'Red', + 7 => 'Yellow', + 8 => 'Unused', + 9 => 'DarkBlue', + 10 => 'DarkCyan', + 11 => 'DarkGreen', + 12 => 'DarkMagenta', + 13 => 'DarkRed', + 14 => 'DarkYellow', + 15 => 'DarkGray', + 16 => 'LightGray' + ], + $underlineStyles = [ + 'ul' => 'solid 1px', // Underline + 'uld' => 'dotted 1px', // Dotted underline + 'uldash' => 'dashed 1px', // Dashed underline + 'uldashd' => 'dashed 1px', // Dash-dotted underline + 'uldashdd' => 'dashed 1px', // Dash-dot-dotted underline + 'uldb' => 'double 1px', // Double underline + 'ulhwave' => 'wavy 3px', // Heavy wave underline + 'ulldash' => 'dashed 1px', // Long dashed underline + 'ulnone' => '', // no underline + 'ulth' => 'solid 2px', // Thick underline + 'ulthd' => 'dotted 2px', // Thick dotted underline + 'ulthdash' => 'dashed 2px', // Thick dashed underline + 'ulthdashd' => 'dashed 2px', // Thick dash-dotted underline + 'ulthdashdd' => 'dashed 2px', // Thick dash-dot-dotted underline + 'ulthldash' => 'dashed 2px', // Thick long dashed underline + 'ululdbwave' => 'wavy 2px', // Double wave underline +// 'ulw' => 'wavy 1px', // Word underline + 'ulwave' => 'wavy 1px', // Wave underline + ]; + + public bool + $b = false, // Bold + $caps = false, // All capitals + $embo = false, // Emboss + $i = false, // Italic + $impr = false, // Engrave (imprint) + $outl = false, // Outline + $scaps = false, // Small capitals + $shad = false, // Shadow + $strike = false, // Strike-through + $striked = false, // Double strike-through + $hidden = false; + + public int + $fs = 0; // Font size in half-points, default is 24 = 12pt + + public + $underline = 'ulnone', + $verticalAlign = '', // sub / super + $fontcolor = null, + $background = null, + $font = null, + $highlight = null, + $ulc = null; // Underline color + + public function reset($defaultFont = null) : void + { + $this->b = false; + $this->caps = false; + $this->embo = false; + $this->i = false; + $this->impr = false; + $this->outl = false; + $this->scaps = false; + $this->shad = false; + $this->strike = false; + $this->striked = false; + $this->hidden = false; + $this->fs = 0; + $this->underline = 'ulnone'; + $this->verticalAlign = ''; + $this->fontcolor = null; + $this->background = null; + $this->highlight = null; + $this->ulc = null; + $this->font = isset($defaultFont) ? $defaultFont : null; + } + + public function __toString(): string + { + $style = []; + + if ($this->b ) $style[] = 'font-weight:bold'; + if ($this->caps ) $style[] = 'text-transform:uppercase'; +// if ($this->embo ) $style[] = 'text-shadow: 1px 4px 4px #555;background-clip:text'; + if ($this->i ) $style[] = 'font-style:italic'; +// if ($this->impr ) $style[] = 'text-shadow: rgba(245,245,245,0.5) 3px 5px 1px;background-clip:text'; +// if ($this->outl ) $style[] = ''; + if ($this->scaps ) $style[] = 'font-variant:small-caps'; +// if ($this->shad ) $style[] = ''; + if ($this->strike ) $style[] = 'text-decoration:line-through'; +// if ($this->striked ) $style[] = ''; + if ($this->verticalAlign) $style[] = "vertical-align:{$this->verticalAlign};font-size:smaller"; + if (!empty(static::$underlineStyles[$this->underline])) { + $value = 'text-decoration:underline'; + if (!empty(static::$colortbl[$this->ulc])) { + $value .= ' ' . static::$colortbl[$this->ulc]; + } + $value .= ' ' . static::$underlineStyles[$this->underline]; + $style[] = $value; + } + if ($this->hidden) $style[] = 'display:none'; + if (!empty(static::$fonttbl[$this->font])) { + $font = (string) static::$fonttbl[$this->font]; + if ($font) { + $style[] = $font; + } + } + if (0 < $this->fs) { +// $style[] = 'font-size:'.\ceil($this->fs / 2).'pt'; +// $style[] = 'font-size:'.\ceil($word->parameter * 16 / 24).'px'; + $style[] = 'font-size:'.\round($this->fs / 24, 2).'em'; + } + if (!empty(static::$colortbl[$this->fontcolor])) { + $style[] = 'color:' . static::$colortbl[$this->fontcolor]; + } + if (!empty(static::$colortbl[$this->background])) { + $style[] = 'background-color:' . static::$colortbl[$this->background]; + } else if (!empty(static::$highlights[$this->highlight])) { + $style[] = 'background-color:' . static::$highlights[$this->highlight]; + } + return $style ? 'style="'.\implode(';', $style).'"' : ''; + } + + /* + * Check whether this Style is equal to another Style. + */ + public function equals(?Style $style) : bool + { + return $style + && ($this->b == $style->b) + && ($this->caps == $style->caps) +// && ($this->embo == $style->embo) + && ($this->i == $style->i) +// && ($this->impr == $style->impr) +// && ($this->outl == $style->outl) + && ($this->scaps == $style->scaps) +// && ($this->shad == $style->shad) + && ($this->strike == $style->strike) + && ($this->striked == $style->striked) + && ($this->verticalAlign == $style->verticalAlign) + && ($this->underline == $style->underline) + && ($this->ulc == $style->ulc) + && ($this->hidden == $style->hidden) + && ($this->fs == $style->fs) + && ($this->fontcolor == $style->fontcolor) + && ($this->background == $style->background) + && ($this->highlight == $style->highlight) + && ($this->font == $style->font) + ; + } +} diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/rtf/text.php b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/text.php new file mode 100644 index 000000000..d0a229fee --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/snappymail/rtf/text.php @@ -0,0 +1,18 @@ +text = $text; + } + + public function __toString(): string + { + return $this->text; + } +}